我正在尝试在配置单元中创建一个内部(托管)表来存储增量日志数据。table是这样的:
CREATE TABLE logs (foo INT, bar STRING, created_date TIMESTAMP)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '<=>'
STORED AS TEXTFILE;
我需要定期将数据加载到此表中。
LOAD DATA INPATH '/user/foo/data/logs' INTO TABLE logs;
但是数据没有正确地插入到表中。分隔符可能有问题。找不到原因。
日志行示例:
120<=>abcdefg<=>2016-01-01 12:14:11
在 select * from logs;
我明白了,
120 =>abcdefg NULL
第一个属性很好,第二个属性包含分隔符的一部分,但由于插入的是字符串,第三个属性将为空,因为它需要日期时间。
任何人都可以帮助如何提供自定义分隔符和加载数据成功。
3条答案
按热度按时间hmmo2u0o1#
我建议你用我前面提到的答案。你也可以试试regexserde。但是,由于regexserde默认接受string,所以您还需要一个额外的步骤将其解析为数据类型。
regexserde可以方便地处理一些日志文件,这些文件中的数据不是用一个分隔符统一排列的。
输出:
avwztpqn2#
在表中加载数据
wwodge7n3#
默认情况下,配置单元只允许用户使用单个字符作为字段分隔符。虽然有regexserde来指定多个字符分隔符,但使用起来可能会让人望而生畏,特别是对于业余爱好者。
这个补丁(hive-5871)添加了一个新的
SerDe
命名MultiDelimitSerDe
. 与MultiDelimitSerDe
,用户可以在创建表时指定多字符字段分隔符,其方式与典型的表创建方式最为相似。