Select 并计算 athena 中的数组键

Select and count array keys in athena

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

轻松解析一个值
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.*

您可以使用 cross join unnest。 unnest 将“展开”地图和 return 每个带有键、值列的地图条目的一行。如果你想计算每个键的出现次数,你可以按键分组。例如

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

您可以使用 map_keys 函数从 payload 中提取键并取消嵌套。

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