如何将数组解包为列
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 列,例如 date
、name
、value
:
-- 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
我有一个 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 列,例如 date
、name
、value
:
-- 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 |