【问题标题】:Aggregate JSON object's own key value attributes in Athena using OpenX SerDe使用 OpenX SerDe 在 Athena 中聚合 JSON 对象自己的键值属性
【发布时间】:2020-12-26 22:04:55
【问题描述】:

我有一个类似于这两个示例事件的 JSON 结构:

事件 1

    {
      "event":{
             "type" : "FooBarEvent"
             "kv":{
                "key1":"value1",
                "key2":"value2",
                "3":"three",
                "d":"4"
             }
      }
    }

事件 2

    {
      "event":{
             "type" : "FooBarEvent"
             "kv":{
                "key1":"value1",
                "key2":"value2000",
                "e": "4"
             }
      }
    }

请注意,我不知道有哪些键和值进入,我想汇总(计数)它们。这两个事件的输出如下所示:

+-----------+------+-----------+--------+
| EventType | Key  | Value     | Amount |
+-----------+------+-----------+--------+
| Foobar    | key1 | value1    | 2      |
+-----------+------+-----------+--------+
| Foobar    | key2 | value1    | 1      |
+-----------+------+-----------+--------+
| Foobar    | key2 | value2000 | 1      |
+-----------+------+-----------+--------+
| Foobar    | 3    | three     | 1      |
+-----------+------+-----------+--------+
| Foobar    | d    | 4         | 1      |
+-----------+------+-----------+--------+
| Foobar    | e    | 4         | 1      |
+-----------+------+-----------+--------+

有没有一种方法可以在不改变 JSON 结构的情况下在 Athena 中实现这一点?如何最好地映射和展平/查询结构?

【问题讨论】:

    标签: sql json hive presto amazon-athena


    【解决方案1】:

    您好,它应该使用UNNEST 功能并将kv 转换为地图。假设您的数据存储在名为 json_data 的表中,则以下查询应该可以工作

    with data_formated as
    (
        select *
        ,json_extract_scalar(json_field,'$.event.type') event_type
        ,cast(json_extract(json_field,'$.event.kv') as map(varchar,varchar)) key_value
        from json_data
    )
    ,unnesting_data as
    (
        select *
        from data_formated
        cross join unnest(key_value) as t (k,v)
    )
    select event_type,k,v,count(1) amount
    from unnesting_data
    group by 1,2,3
    order by 1,2,3;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2020-09-21
      • 2015-10-15
      相关资源
      最近更新 更多