我正在尝试在配置单元中创建一个内部(托管)表,该表可以存储我的增量日志数据。该表如下所示:

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

第一个属性很好,第二个属性包含定界符的一部分,但由于它是要插入的字符串,第三个属性为空,因为它期望日期时间。

谁能帮忙提供成功的自定义分隔符和数据加载方法。

最佳答案

默认情况下,配置单元仅允许用户使用单个字符作为字段定界符。尽管有RegexSerDe来指定多字符定界符,但是使用它可能令人生畏,尤其是对于业余爱好者。

补丁(HIVE-5871)添加了一个名为SerDe的新MultiDelimitSerDe。使用MultiDelimitSerDe用户可以在创建表时以与典型表创建最相似的方式指定多字符字段定界符

hive> CREATE TABLE logs (foo INT, bar STRING, created_date TIMESTAMP)
    > ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
    > WITH SERDEPROPERTIES ("field.delim"="<=>")
    > STORED AS TEXTFILE;

hive> dfs -put /home/user1/multi_char.txt /user/hive/warehouse/logs/. ;

hive> select * from logs;
OK
120 abcdefg 2016-01-01 12:14:11
Time taken: 1.657 seconds, Fetched: 1 row(s)
hive>

关于hadoop - 使用自定义分隔符将数据加载到Hive中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38825285/

10-11 19:59
查看更多