Athena AWS 解析 json 到表

问题描述 投票:0回答:1

我有我的桌子:

事件名称 价值
事件1 {“link_id”:“耳机”,“规格”:“dtx”}
事件2 {“geo”:“22.12.11”}

我需要解析单独列中的每个键,如下所示:

事件名称 link_id 规格 地理
事件1 耳机 dtx
事件2 22.12.11

我知道解决方案:

WITH my_table (event_name, value) AS (
    values 
    ('event1','{"link_id":"headphones","spec":"dtx"}'),
    ('event2','{"geo":"22.12.11"}')
)
SELECT 
event_name,
json_extract(value, '$.link_id') as link_id,
json_extract(value, '$.spec') as spec,
json_extract(value, '$.geo') as geo
FROM my_table;

但是我可以在不指定每个参数的情况下这样做吗?我有大约。 100 个参数。

sql amazon-web-services amazon-athena presto trino
1个回答
0
投票

但是我可以在不指定每个参数的情况下这样做吗?我有大约。 100 个参数。

简而言之 - 不,如果您希望它们作为单独的列,则不能。可能更惯用(并且可能适合您)的 SQL 方法是将它们解析为单独的键值行:

WITH my_table (event_name, value) AS (
    values 
    ('event1','{"link_id":"headphones","spec":"dtx"}'),
    ('event2','{"geo":"22.12.11"}')
)

SELECT event_name,
    key,
    val
FROM my_table,
     unnest(cast(json_parse(value) as map(varchar, json))) as t(key, val);

输出:

事件名称 钥匙 val
事件1 link_id 耳机
事件1 规格 dtx
事件2 地理 22.12.11

附言

您的目标需要动态 SQL 生成(例如使用一些“外部”脚本)或 Presto/Trino ATM 不支持的动态数据透视。

© www.soinside.com 2019 - 2024. All rights reserved.