如何将数组解包为列

How to unpack array as columns

我有一个 table 看起来像这样:

date volume_info
2022-01-01 {"temple": 18348, "benny": 8524, "polly": 1698, "sally": 5860}
2022-01-02 {"temple": 2000, "benny": 1000, "polly": 3904, "sally": 1776, "benjamin": 2}

我正在尝试这样设置它:

date temple benny polly sally benjamin
2022-01-01 18348 8524 1698 5860 NULL
2022-01-02 2000 1000 3904 1776 2

但我不知道地图中有多少项目(第一个 table 每天更新一次)所以我想解压地图并将它们设置为列而不提前知道时间地图中有多少项目。

是否可以在事先不知道映射中的键是什么的情况下“旋转”这些值?

AFAIK presto 不支持动态旋转。此外,如果“记录”的数量没有限制,我认为将它们变成未知数量的列没有多大意义。尽管您可以将数据转换为“传统”3 列,例如 datenamevalue:

-- sample data
WITH dataset (date, volume_info) AS (
    VALUES   
('2022-01-01',  '{"temple": 18348, "benny": 8524, "polly": 1698, "sally": 5860}'),
('2022-01-02',  '{"temple": 2000, "benny": 1000, "polly": 3904, "sally": 1776, "benjamin": 2}')
) 

--query
select date, name, value
from(
 select date, cast(json_parse(volume_info) as map(varchar, integer)) m
 from dataset
)
cross join unnest(map_keys(m), map_values(m)) as t(name, value)

输出:

date name value
2022-01-01 temple 18348
2022-01-01 benny 8524
2022-01-01 polly 1698
2022-01-01 sally 5860
2022-01-02 temple 2000
2022-01-02 benny 1000
2022-01-02 polly 3904
2022-01-02 sally 1776
2022-01-02 benjamin 2