1

我的日志如下所示: 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/';

它只需要第一个事件而忽略其他事件......

4

1 回答 1

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;

另请阅读横向视图

在 Athena 中使用UNNEST 和 CROSS JOIN

select t.user_id, e.event
       from tablename t
       CROSS JOIN UNNEST(SPLIT(t.events,';')) AS e (event)
于 2019-05-09T09:22:10.323 回答