在下面的场景中,如何将数据插入到表中?

h5qlskok  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(294)

我是hadoop的新手,我必须在hive的表中添加数据。我有来自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作为列名,并将.4.4作为该列的值,在 9=66 9应该是列名,66应该是该列的值,依此类推。。。。像这样的原始文件中有很多行。
第二,对于另一行也是这样,数据将附加到配置单元中表的下一行。
现在我该做些我想不出来的事。
任何帮助都是值得的。

nqwrtyyt

nqwrtyyt1#

将文件复制到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
gev0vcfq

gev0vcfq2#

我首先创建一个包含这些数据的制表符分隔文件。我建议在评论中使用正则表达式,但如果这不是你的强项,你可以直接在 <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或tab分隔值文件的文章,但是我将给你一个通用的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];

希望这能给你一个更好的想法如何继续。

相关问题