【问题标题】:Select and count array keys in athena在 athena 中选择和计算数组键
【发布时间】:2021-11-30 20:17:14
【问题描述】:

我有很多行数据代表我的数据库中的事件。每行都有一个包含键和值数组的“有效负载”列。我可以通过使用轻松解析一个值

Select
payload.keyname
from Database

但我正在尝试获取给定日期出现的所有键的列表和计数。

|                   payload                               |    
|{id=a, gameid=x, gametype=1, sponserid=null}             |
|{id=b, gameid=y, gametype=2, action=jump, sponserid=null}|
|{id=c, gameid=z, action=jump, sponserid=null}            |

期望的输出

|    Key  |Count|
|id       |  3  |
|game     |  3  |
|gametype |  2  |
|action   |  2  |
|sponserid|  2  |

是否有一些方法可以轻松地查询数组中的键?比如

Select
payload.*, count(*)
from Database
group by payload.*

【问题讨论】:

  • payload.keyname的类型是什么?

标签: sql amazon-athena


【解决方案1】:

您可以使用map_keys 函数从payload 中提取密钥并在其上取消嵌套。

select key, count(1) as count
from database.table, unnest(map_keys(payload)) as X(key)
group by 1

【讨论】:

  • 这可行,但事实证明该列实际上是 row() 类型,因此会引发错误。
  • 如果列是行类型,那么您可以简单地删除 UNNEST 并与列交叉连接
【解决方案2】:

您可以使用cross join unnest。 unnest 将“展开”地图并为每个地图条目返回一行,其中包含键、值列。如果要计算每个键的出现次数,可以按键分组。例如

select key, count(*)
from mydb cross join unnest(payload) A(key, value)
group by 1

请参阅the docs 了解更多信息。

----- 编辑----

如果您的列已经是行格式,您可以改为:

select payload.keyname, count(*)
from mydb cross join payload
group by 1

【讨论】:

  • 谢谢!这似乎是进步,但我收到一条错误消息,提示“表有效负载不存在”,所以我对其进行了修改:select payload.* from mydb cross join mydb.payload group by 1 返回“schema mydb 不存在”是Athena 中是否需要特定格式才能使其识别列 Payload 以将其视为自己的表?
  • 您实际上是在使用“mydb”还是您的表的实际名称(原始问题中的“数据库”?)
  • 我使用的是实际的数据库名称。似乎具体问题在于 Athena 在尝试将其用于交叉联接时如何识别列有效负载。
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多