如何解决左联接的AWS Athena异常无法正常工作
我有一个嵌套的JSON结构,我想在其中嵌套一个JSON子树。将填充A或B,并将event.type标记为“ A”或“ B”。这是两个简化的示例:
{
"event": {
"event_type": "A","time": 1599692445083,"A" : {
"name": "item1","revenue": 100
}
}
}
}
{
"event": {
"event_type": "B","B" : {
"items" : [
{"name": "item2",revenue" : 10},{"name": "item3",revenue" : 20},]
}
}
}
}
查询到目前为止可以正常工作,但是我有一个问题,即UNNEST仅适用于交叉联接,因此我失去了所有“ A”事件,因为我需要左联接。请注意,我会进行多个汇总,因此以一种更简单的方式单独计算总和就足够了。
select
from_unixtime( (floor(event.time/1000) / (60 * 60)) *60*60) as event_hour,count(*) filter(where event.event_type = 'A') as A_items,count(*) filter(where event.event_type = 'B') as B_items
FROM mydb.event_table
left join unnest(event.B.items) as t(b)
WHERE
year=2020 and month=9 and day=18 and hour=1
GROUP BY
from_unixtime( (floor(event.time/1000) / (60 * 60)) *60*60),
对于 cross join unnest 查询,执行,但是由于A没有项Array,所以我不计算任何条目。对于 left join unnest ,我收到一条错误消息(也很有趣,它在那里也声明了“ left”):
mismatched input 'where' expecting {'join','cross','inner','left','right','full','natural','using','on','tablesample'}
有没有办法在雅典娜的巢穴中使用左联接?
解决方法
雅典娜基于Presto .172
在Presto 319中添加了LEFT JOIN
和UNNEST
添加对涉及UNNEST的INNER和OUTER联接的支持。
我认为雅典娜要等到他们才支持
- 升级到新的Presto版本
- 将该功能反向移植到其分支
在此期间,您可以运行最新版本的Presto:
- 使用EMR 6.1,选择“ PrestoSQL”组件
- 使用Starburst's Presto as a Service on AWS
此外,正如@GMB所指出的,JOIN
需要ON
子句(可以像ON true
一样简单)。
有一种变通方法,其中提到的用例在使用交叉连接进行UNNESTING时不松散条目。看起来很丑,但是直到雅典娜将支持新的Presto功能时,它才起作用。
代替
left join unnest(event.B.items) as t(b)
一个人可以将左联接重写为具有合并的交叉联接:
cross join unnest(coalesce(event.B.items,array[null])) as t(b)
,
只需添加一个伪on
子句:
from mydb.event_table b
left join unnest(event.b.items) as t(b) on 1 = 1
这可以用横向连接更清楚地表达:
from mydb.event_table
left join lateral unnest(event.b.items) as t(b) on 1 = 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。