hadoop - 在以下情况下如何将数据插入表中?

标签 hadoop hive fix-protocol

我是 hadoop 的新手,我必须将数据添加到 hive 的表中。
我有来自 FIX4.4 协议(protocol)的数据,像这样......

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 应该是该列的值,依此类推......像这样的原始文件中有很多行。

其次,对于另一行也是如此,并且该数据将附加到配置单元的下一行表中。

现在我该怎么做,我无法思考。

任何帮助都将是可观的。

最佳答案

我将首先创建一个包含此数据的制表符分隔文件。我建议在评论中使用正则表达式,但如果这不是你的强项,你可以拆分 <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,其中包含标题和下一行中的值。

这意味着现在您有一个 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];

希望这能让您更好地了解如何进行。

关于hadoop - 在以下情况下如何将数据插入表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42114638/

相关文章:

apache-spark - hive on spark - 为什么 'select *' 不生成 spark 应用程序/执行程序?

快速修复 - 未为此消息类型定义标签

python - 使用 stunnel 建立与 DUKASCOPY 的连接

hadoop - 配置单元将数据加载到HDFS中

hadoop - yarn 组件

hadoop - 如果我想使用kafka从API获取一些数据。有哪些步骤?

hadoop - 从本地加载大文件到HDFS的最佳方法是什么

sql-server - Hive CTE,我可以将值查询为表吗?

protocols - 修复内部序列号

hadoop - distcp本质上是否使用SSL/TLS将文件传输到AWS S3