我的日志如下:
client_id;event_1;event_2;event3
我想得到一个这样的SQL表:
client_id | event
---------------------
... | event_1
... | event_2
... | event_3
我是Hive的新手,在我看来,一条日志行总是在结果SQL表中提供一项。 我尝试了以下操作(不成功):
CREATE EXTERNAL TABLE IF NOT EXISTS tablename (
client_id String,
`event` String
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^([^\;]+);.*([^\;]+).*$" )
LOCATION 's3://myBucket/prefix/';
只需要第一个事件,而忽略其他事件...
答案 0 :(得分:3)
不幸的是,无法在表DDL中使用SerDe生成行。在Hive中也可以这样做。
(1)将所有用户事件读为一列:
CREATE EXTERNAL TABLE IF NOT EXISTS tablename (
client_id String,
events String
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^([^\\;]+)\\;(.*)$" )
LOCATION 's3://myBucket/prefix/';
检查,它应该读取两列,user_id和所有串联的事件:
'client_id'
和'event_1;event_2;event3'
(2)拆分事件并爆炸以生成行:
select t.user_id, e.event
from tablename t
lateral view outer explode(split(t.events,'\\;')) e as event;
也请阅读有关Lateral View的信息。
在雅典娜中使用UNNEST with CROSS JOIN:
select t.user_id, e.event
from tablename t
CROSS JOIN UNNEST(SPLIT(t.events,';')) AS e (event)