我是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 :(得分:0)
我首先要创建一个包含此数据的制表符分隔文件。我建议在评论中使用正则表达式,但如果这不是您的强项,则可以将<SHO>
标记与=
分开。由于您未指定要使用的语言,因此我建议使用“解决方案”。在Python中。
下面的代码显示了如何将一条输入行写入CSV文件。
这可以很容易地扩展为支持多个这些行,或者在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,其中包含标题和下一行中的值。
这意味着现在您有一个Hive可以理解的文件。 我相信你可以找到很多关于导入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];
希望这能让您更好地了解如何继续。
答案 1 :(得分:0)
将文件复制到HDFS并创建一个包含单个列的外部表(C8),然后使用下面的select语句提取每个列
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