AWS Athena (Presto) 如何将值是数组的映射转置为行

时间:2021-07-07 07:57:41

标签: amazon-athena presto

我试图在 Athena 上压平一个复杂的结构

我的表格中的一行看起来像

<头>
id 标签
2003301084 {repeats=[3], copayment=[CoPayment, other], 优惠状态=[E, T], prescriberdate=[2014-06-29], previouspurchasesonsamescript=[0], age=[49], numberofscripts= [1]}

我想去:

<头>
id 标签 价值
2003301084 重复 3
2003301084 共付额 共付额
2003301084 共付额 其他
2003301084 优惠状态 E
2003301084 优惠状态 T
2003301084 开药日期 2014-06-29
2003301084 以前购买过相同的脚本 0
2003301084 年龄 49
2003301084 脚本数量 1

我找不到深入到结构中的例子

1 个答案:

答案 0 :(得分:0)

您可以使用 UNNEST 将映射键/值对提取到单独的行中,然后将各个数组元素提取到单独的行中:

WITH data(id, tags) AS
(
    VALUES (
        2003301084,
        map_from_entries(array[
            row('repeats', array['3']),
            row('copayment', array['CoPayment', 'other']),
            row('concessionalstatus', array['E', 'T']),
            row('prescriberdate', array['2014-06-29']),
            row('previouspurchasesonsamescript', array['0']),
            row('age', array['49']),
            row('numberofscripts', array['1'])
        ])
    )
),
arrays AS (
    SELECT id, tag, entries
    FROM data CROSS JOIN UNNEST(tags) AS m(tag, entries)
)
SELECT id, tag, value
FROM arrays CROSS JOIN UNNEST(entries) AS a(value)

=>

     id     |              tag              |   value
------------+-------------------------------+------------
 2003301084 | repeats                       | 3
 2003301084 | copayment                     | CoPayment
 2003301084 | copayment                     | other
 2003301084 | concessionalstatus            | E
 2003301084 | concessionalstatus            | T
 2003301084 | prescriberdate                | 2014-06-29
 2003301084 | previouspurchasesonsamescript | 0
 2003301084 | age                           | 49
 2003301084 | numberofscripts               | 1
(9 rows)
相关问题