我们可以从一行创建多个条目吗?
Can we create several entries from one line?
我的日志是这样的:
client_id;event_1;event_2;event3
我想要这样的 SQL Table:
client_id | event
---------------------
... | event_1
... | event_2
... | event_3
我是 Hive 的新手,在我看来,一个日志行总是在结果 SQL table 中提供一个条目。
我尝试了以下(不成功):
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/';
它只需要第一个事件而忽略其他事件...
不幸的是,无法在 table 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 with CROSS JOIN:
select t.user_id, e.event
from tablename t
CROSS JOIN UNNEST(SPLIT(t.events,';')) AS e (event)
我的日志是这样的:
client_id;event_1;event_2;event3
我想要这样的 SQL Table:
client_id | event
---------------------
... | event_1
... | event_2
... | event_3
我是 Hive 的新手,在我看来,一个日志行总是在结果 SQL table 中提供一个条目。 我尝试了以下(不成功):
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/';
它只需要第一个事件而忽略其他事件...
不幸的是,无法在 table 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 with CROSS JOIN:
select t.user_id, e.event
from tablename t
CROSS JOIN UNNEST(SPLIT(t.events,';')) AS e (event)