使用自定义分隔符将数据加载到配置单元中

bvn4nwqk  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(289)

我正在尝试在配置单元中创建一个内部(托管)表来存储增量日志数据。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

第一个属性很好,第二个属性包含分隔符的一部分,但由于插入的是字符串,第三个属性将为空,因为它需要日期时间。
任何人都可以帮助如何提供自定义分隔符和加载数据成功。

hmmo2u0o

hmmo2u0o1#

我建议你用我前面提到的答案。你也可以试试regexserde。但是,由于regexserde默认接受string,所以您还需要一个额外的步骤将其解析为数据类型。
regexserde可以方便地处理一些日志文件,这些文件中的数据不是用一个分隔符统一排列的。

CREATE TABLE logs_tmp  (foo STRING,bar STRING, created_date STRING) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
WITH SERDEPROPERTIES (
 "input.regex" = "(\\d{3})<=>(\\w+)<=>(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})"
) 
STORED AS TEXTFILE;

LOAD DATA LOCAL INPATH 'logs.txt' overwrite into table logs_tmp;

CREATE TABLE logs  (foo INT,bar STRING, created_date TIMESTAMP) ;

INSERT INTO TABLE logs SELECT cast(foo as int) as foo,bar,cast(created_date as TIMESTAMP) as created_date from logs_tmp

输出:

OK
    Time taken: 0.213 seconds    
    hive> select * from logs;
    120     abcdefg 2016-01-01 12:14:11
avwztpqn

avwztpqn2#

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

在表中加载数据

load data local inpath '/home/kishore/Data/input.txt' overwrite into table logs;
wwodge7n

wwodge7n3#

默认情况下,配置单元只允许用户使用单个字符作为字段分隔符。虽然有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>

相关问题