【发布时间】:2020-04-21 09:06:19
【问题描述】:
我有以下这种格式的表格
create table raw_data (
userid BIGINT,
city VARCHAR,
campaign ARRAY <
STRUCT <campaignid BIGINT,
campaign_start_at TIMESTAMP,
campaign_ends_at TIMESTAMP,
parameters ARRAY<
STRUCT < goal VARCHAR,
reward VARCHAR
>
campaignstatus ARRAY
STRUCT < seen BOOLEAN ,
seen_at TIMESTAMP
action VARCHAR,
action_at TIMESTAMP
>
>
>)
我希望最终的结果是这样的:
userid|city|campaignid|campaign_start_at|campaign_ends_at|goal|reward|seen|seen_at|action|action_at
1 | Athens | 234 | 2019-03-19 12:00 |2019-03-19 14:00| 10| 2.7 | yes |2019-03-19 10:23|null|null
1 | Athens | 234 | 2019-03-19 12:00 |2019-03-19 14:00| 10| 2.7 | yes |2019-03-17 10:23|participate|2019-03-19 11:20
2 | Athens | 234 | 2019-03-19 12:00 |2019-03-19 14:00| 10| 2.7 | yes |2019-03-19 10:23|ignore|2019-03-19 10:10
3 | Athens | 234 | 2019-03-19 12:00 |2019-03-19 14:00| 10| 2.7 | null|null|null|null
3 | Athens | 234 | 2019-03-19 12:00 |2019-03-19 14:00| 10| 2.7 | yes |2019-03-19 12:23|blocked|2019-03-19 12:24
换句话说,我想取消嵌套数据并查找有关用户 ID 级别的信息。 我尝试使用以下脚本取消嵌套表
select *
FROM raw_data
LEFT JOIN UNNEST(campaign) as t(campaigns)
但它返回错误:表 hive.default.campaign 不存在
我的问题是:
是否可以在 presto 中并行取消嵌套多个数组?
- 如果是,我该怎么做?
- 如果不是,我应该按照什么顺序来取消嵌套更高级别(用户 ID)中的列,例如:由内向外或反之亦然?一个例子将不胜感激。
【问题讨论】:
-
"Table hive.default.campaign 不存在" -- 这听起来不像是一条正确的消息,但
events表中是否有campaign列? -
另外,您打算生成
parameters和campaignstatus的笛卡尔积还是“压缩”它们? -
嘿@PiotrFindeisen!首先,events 表命名错误 - 已更正。它应该是表 raw_data (是的,
raw_data有一个活动列)对于你的第二个问题,我想要一个笛卡尔积campaigns、parameters和campaignstatus。我希望所有这三个数组都链接到 uderid。例如:userid = 1 有两条相同活动 id (234) 的记录,一条记录是从用户那里看到的,但他没有采取任何行动,但当用户第二次看到他参与的活动时。不知道上面说的有没有道理? -
仅供参考:返回的错误是语法错误。
标签: presto