使用 Presto 解析 JSON 列
Parse JSON column using Presto
我在 Presto 中有一个 table 看起来像
Date
Rates
1/1/2022
{"USD":"725.275","GBP":"29.275000000000002","CAD":"0.713352"}
1/2/2022
{"USD":"745.275","GBP":"40.275000000000002","CAD":"0.813352"}
我希望查询的输出类似于:
Date Currency Rate
1/1/2022 USD 725.275
1/2/2022 USD 745.275
1/1/2022 GBP 29.275
1/2/2022 GBP 40.275
1/1/2022 CAD 0.713352
1/2/2022 CAD 0.813352
但使用他们的 documentation.
似乎无法弄清楚
假设 Rates
是 JSON
类型的列(否则使用 json_parse
)并且您不想使用 json_extract_scalar
(json_extract_scalar(Rates, '$.USD')
, json_extract_scalar(Rates, '$.GBP')
, ...) - 处理这种“动态”的常用方法 json 是将其转换为 map
(例如 map(varchar, double)
在这种情况下) 并使用 unnest
:
WITH dataset ( Date,Rates) AS (
VALUES ('1/1/2022', json '{"USD":"725.275","GBP":"29.275000000000002","CAD":"0.713352"}'),
('1/2/2022', json '{"USD":"745.275","GBP":"40.275000000000002","CAD":"0.813352"}')
)
--query
select date, currence, rate
from dataset
cross join unnest(cast(rates as map(varchar, double))) t(currence, rate)
输出:
date
currence
rate
1/1/2022
CAD
0.713352
1/1/2022
GBP
29.275000000000002
1/1/2022
USD
725.275
1/2/2022
CAD
0.813352
1/2/2022
GBP
40.275
1/2/2022
USD
745.275
我在 Presto 中有一个 table 看起来像
Date | Rates |
---|---|
1/1/2022 | {"USD":"725.275","GBP":"29.275000000000002","CAD":"0.713352"} |
1/2/2022 | {"USD":"745.275","GBP":"40.275000000000002","CAD":"0.813352"} |
我希望查询的输出类似于:
Date Currency Rate
1/1/2022 USD 725.275
1/2/2022 USD 745.275
1/1/2022 GBP 29.275
1/2/2022 GBP 40.275
1/1/2022 CAD 0.713352
1/2/2022 CAD 0.813352
但使用他们的 documentation.
似乎无法弄清楚假设 Rates
是 JSON
类型的列(否则使用 json_parse
)并且您不想使用 json_extract_scalar
(json_extract_scalar(Rates, '$.USD')
, json_extract_scalar(Rates, '$.GBP')
, ...) - 处理这种“动态”的常用方法 json 是将其转换为 map
(例如 map(varchar, double)
在这种情况下) 并使用 unnest
:
WITH dataset ( Date,Rates) AS (
VALUES ('1/1/2022', json '{"USD":"725.275","GBP":"29.275000000000002","CAD":"0.713352"}'),
('1/2/2022', json '{"USD":"745.275","GBP":"40.275000000000002","CAD":"0.813352"}')
)
--query
select date, currence, rate
from dataset
cross join unnest(cast(rates as map(varchar, double))) t(currence, rate)
输出:
date | currence | rate |
---|---|---|
1/1/2022 | CAD | 0.713352 |
1/1/2022 | GBP | 29.275000000000002 |
1/1/2022 | USD | 725.275 |
1/2/2022 | CAD | 0.813352 |
1/2/2022 | GBP | 40.275 |
1/2/2022 | USD | 745.275 |