我们可以从一行创建多个条目吗?

c8ib6hqw  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(358)

我的日志如下所示: client_id;event_1;event_2;event3 我想得到这样一个sql表:

client_id |   event
 ---------------------
    ...    |  event_1
    ...    |  event_2
    ...    |  event_3

我是新来的配置单元,似乎在我看来,一个日志行总是提供一个项目在结果的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/';

只需要第一个事件,忽略其他事件。。。

x33g5p2x

x33g5p2x1#

不幸的是,无法在表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\u 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;

另请阅读侧视图。
在雅典娜中,使用unnest和交叉连接:

select t.user_id, e.event
       from tablename t
       CROSS JOIN UNNEST(SPLIT(t.events,';')) AS e (event)

相关问题