Как создать вложенную таблицу в Hive для формата файла FIX
В моем исследовании мы используем формат протокола ( FIX 5.0 SP2) и данные ( CME DataMine). Но у меня возникают проблемы при создании таблицы для этих данных (вложенные таблицы). Например, основной формат сообщения задается сообщением № 1, начиная с (^A1128) и заканчивая (^ A10). Теперь в случае сообщения № 2 у нас есть одно и то же основное сообщение, начинающееся с (^A1128), и несколько сообщений, начинающихся с (^A1023) и заканчивающихся (^ A346).
MSG#1 MSG#2
---------------------------------------------------------------------
^A1128=9 ^A1128=9
^A9=136 ^A9=1417
^A35=X ^A35=X
^A49=CME ^A49=CME
^A34=578 ^A34=731
^A52=20130714180133577 ^A52=20130714190005961
^A75=20130715 ^A75=20130710
^A268=1 ^A268=15
^A279=0 ^A279=0
^A22=8 ^A22=8
^A48=111473 ^A48=28112
^A64=20130712 ^A83=2
^A83=1 ^A107=ESZ3
^A107=ESU4 ^A269=0
^A269=6 ^A270=166000
^A270=164350 ^A271=1
^A273=180133000 ^A273=190005000
^A10=248 ^A336=0
^A346=1
^A1023=1
^A279=0
^A22=8
^A48=28112
^A83=3
^A107=ESZ3
^A269=0
^A270=165675
^A271=1
^A273=190005000
^A336=0
^A346=1
... ... ... ...
^A1023=5
^A10=029
Данные поступают в виде последовательности строк без пробелов, и в конце сообщения есть символ (\ n). Что-то вроде этого,
^A1128=9^A9=157^A35=X^A49=CME^A34=406238^A52=20130715123719934^A75=20130715^A268=1^A279=1^A22=8^A48=28112^A83=49004^A107=ESZ3^A269=1^A270=166775^A271=186^A273=123719000^A336=2^A346=3^A1023=1^A10=210^A
Вот код, который я использую для создания таблицы в Hive без успеха.
CREATE EXTERNAL TABLE fix_map
(tag MAP<INT, STRING>)
ROW FORMAT DELIMITED
COLLECTION ITEMS TERMINATED BY '1'
FIELDS TERMINATED BY '2'
MAP KEYS TERMINATED BY '='
LOCATION '/user/data/';
Любые предложения будут с благодарностью.
1 ответ
Я не нашел конкретного ответа на эти вопросы, я использовал другой подход для решения этой проблемы. Первое решение заключается в создании двух разных таблиц: одна для основного исправления msg, другая для вложенной части, а затем объединение двух таблиц. Я использовал этот код для создания первой таблицы:
CREATE TABLE futures_fix(
tag MAP<INT,STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '2'
COLLECTION ITEMS TERMINATED BY '1'
MAP KEYS TERMINATED BY '='
LOCATION '/user/lcoation/data/';
Другой подход заключается в использовании инструмента fis2json (npm) из ( SunGard Labs). Эти ребята создали отличный инструмент для декодирования FIX в формат json ( fix2json). После того как вы расшифруете данные, у вас будет больше инструментов для работы с вложенными таблицами, а декодер fi2json изменит все теги на правильные имена! Вот пример вывода fix2json.
{
"ApplVerID":"FIX50SP2",
"BodyLength":"136",
"MsgType":"MARKETDATAINCREMENTALREFRESH",
"SenderCompID":"CME",
"MsgSeqNum":"578",
"SendingTime":"20130714180133577",
"TradeDate":"20130715",
"NoMDEntries":"1",
"MDEntries":[
{
"MDUpdateAction":"NEW",
"SecurityIDSource":"EXCHANGE SYMBOL",
"SecurityID":"111473",
"SettlDate":"20130712",
"RptSeq":"1",
"SecurityDesc":"ESU4",
"MDEntryType":"SETTLEMENT PRICE",
"MDEntryPx":"164350",
"MDEntryTime":"180133000"
}
],
"CheckSum":"248"
}