2017-02-08 3 views
-1

Я новичок в hadoop, и мне нужно добавить данные в таблицу в улье. У меня есть данные из FIX4.4 протокола, что-то вроде этого ...Как вставить данные в таблицу в следующем сценарии?

8=FIX.4.4<SHO>9=85<SHO>35=A<SHO>34=524<SHO>49=SSGMdemo<SHO>52=20150410-15:25:55.795<SHO>56=Trumid<SHO>98=0<SHO>108=30<SHO>554=TruMid456<SHO>10=154<SHO> 
8=FIX.4.4<SHO>9=69<SHO>35=A<SHO>34=1<SHO>49=Trumid<SHO>52=20150410-15:25:58.148<SHO>56=SSGMdemo<SHO>98=0<SHO>108=30<SHO>10=093<SHO> 
8=FIX.4.4<SHO>9=66<SHO>35=2<SHO>34=2<SHO>49=Trumid<SHO>52=20150410-15:25:58.148<SHO>56=SSGMdemo<SHO>7=1<SHO>16=0<SHO>10=174<SHO> 
8=FIX.4.4<SHO>9=110<SHO>35=5<SHO>34=525<SHO>49=SSGMdemo<SHO>52=20150410-15:25:58.164<SHO>56=Trumid<SHO>58=MsgSeqNum too low, expecting 361 but received 1<SHO>10=195<SHO> 

Во-первых, то, что я хочу есть, в 8=FIX.4.4 8 в качестве имени столбца и FIX.4.4 как значение этого столбца, в 9=66 9 должно быть имя столбца, а 66 - значение этого столбца и т. д .... и в таком сыром файле так много строк.

Во-вторых, то же самое для другой строки, и эти данные будут добавляться в следующий ряд таблицы в улье.

Теперь, что я должен делать, я не могу думать.

Любая помощь была бы пригодна.

+0

Как вы обычно в результате чего в данных? Какие инструменты/язык программирования вы используете? Используя довольно простое регулярное выражение, вы, вероятно, можете отфильтровать пары столбцов и значений. С помощью этих пар не должно быть слишком сложно создать CSV, который вы можете легко импортировать в куст. – spijs

+0

Как создать regex для этого файла и преобразовать его в CSV? @spijs –

ответ

0

Сначала я бы создал файл с разделителями-табуляцией, содержащий эти данные. Я предложил использовать регулярное выражение в комментариях, но если это не ваш сильный костюм, вы можете просто разделить на тег <SHO> и =. Поскольку вы не указали язык, который хотите использовать, я предлагаю «решение» в Python. В приведенном ниже коде показано, как записать одну из ваших строк ввода в файл CSV. Это можно легко расширить, чтобы поддерживать несколько этих строк или добавлять строки в CSV-файлы, как только они уже созданы.

import csv 
input = "8=FIX.4.4<SHO>9=85<SHO>35=A<SHO>34=524<SHO>49=SSGMdemo<SHO>52=20150410-15:25:55.795<SHO>56=Trumid<SHO>98=0<SHO>108=30<SHO>554=TruMid456<SHO>10=154<SHO>" 
l = input.split('<SHO>')[:-1] # Don't include last element since it's empty 
list_of_pairs = map(lambda x: tuple(x.split('=')),l) 
d = dict(list_of_pairs) 

with open('test.tsv', 'wb') as c: 
cw = csv.writer(c, delimiter='\t') 
cw.writerow(d.keys()) # Comment this if you don't want to have a header 
cw.writerow(d.values()) 

Что делает этот код сначала разбить входную строку на <SHO> означает, что он создает список col=val строк. Далее я создаю список пар кортежей, где каждый кортеж равен (col,val). Затем он создает словарь из этого, что не является абсолютно необходимым, но может помочь вам, если вы хотите расширить код для большего количества строк. Далее я создаю файл с разделителями табуляции test.tsv, содержащий заголовок и значения в следующей строке.

Это значит, что у вас есть файл, который может понять улей. Я уверен, что вы можете найти много статей по импорту файлов CSV или разделенных табуляцией значений, но я приведу вам пример общего запроса Hive, который вы можете использовать для импорта этого файла, когда он находится в HDFS.

CREATE TABLE if not exists [database].[table] 
([Col1] Integer, [Col2] Integer, [Col3] String,...) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
TBLPROPERTIES('skip.header.line.count'='1'); 

LOAD DATA inpath '[HDFS path]' 
overwrite INTO TABLE [database].[table]; 

Надеюсь, это даст вам лучшее представление о том, как действовать дальше.

+0

Ну, после запроса лидерам, я должен выбрать только java, но мне удалось преобразовать выше логику в java. Кстати спасибо. –

+0

Если это решает ваш вопрос, подумайте о принятии ответа, чтобы другие могли также увидеть, что это полезно :). Рад помочь – spijs

0

Скопируйте файл в HDFS и создать внешнюю таблицу с одним столбцом (С8), затем используйте ниже оператор выбора, чтобы извлечь каждый из столбцов

create external table tablename(
c8 string) 
STORED AS TEXTFILE 
location 'HDFS path'; 


select regexp_extract(c8,'8=(.*?)<SHO>',1) as c8, 
regexp_extract(c8,'9=(.*?)<SHO>',1) as c9, 
regexp_extract(c8,'35=(.*?)<SHO>',1) as c35, 
regexp_extract(c8,'34=(.*?)<SHO>',1) as c34, 
regexp_extract(c8,'49=(.*?)<SHO>',1) as c49, 
regexp_extract(c8,'52=(.*?)<SHO>',1) as c52, 
regexp_extract(c8,'56=(.*?)<SHO>',1) as c56, 
regexp_extract(c8,'98=(.*?)<SHO>',1) as c98, 
regexp_extract(c8,'108=(.*?)<SHO>',1) as c108, 
regexp_extract(c8,'554=(.*?)<SHO>',1) as c554, 
regexp_extract(c8,'35=(.*?)<SHO>',1) as c10 
from tablename 
Смежные вопросы