在 Athena / Presto 中为动态键提取 JSON 对象

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

我的表中有两个

string
格式的列。其中一列中有 json 对象。 JSON 对象中的键不固定 - 所以问题是我不能使用标准的 json 提取函数。这是桌子的样子

时间戳 upstream_tables
2023-02-02T17:34:55.946Z {“ETL_table_1”:真,“ETL_table_2”:真}
2023-02-02T13:30:11.882Z {“ETL_table_3”:真}
2023-02-02T20:12:22.116Z {“ETL_table_4”:真,“ETL_table_5”:真,“ETL_table_6”:假}

我想把这张桌子压平成下面的样子

时间戳 upstream_tablename 已完成
2023-02-02T17:34:55.946Z ETL_table_1 真实
2023-02-02T17:34:55.946Z ETL_table_2 真实
2023-02-02T13:30:11.882Z ETL_table_3 真实
2023-02-02T20:12:22.116Z ETL_table_4 真实
2023-02-02T20:12:22.116Z ETL_table_5 真实
2023-02-02T20:12:22.116Z ETL_table_6

有人可以帮忙吗?花了很多时间使用 map_values 和 map_keys 但无法正确使用。

我唯一能想到的就是这个

select
   timestamp,
    t.*
FROM mytable
   CROSS JOIN UNNEST(map_entries(CAST(json_extract(upstream_tables, '$') AS MAP(VARCHAR, VARCHAR)))) AS t
json amazon-athena presto flatten unnest
1个回答
0
投票

你可以用

UNNEST
json_query
的组合来做到这一点。

首先,使用

json_query
将所有字段值对转换为规范化形式 形状为
{"name": "xxx", value: yyy}
。然后,将它们转换为一个数组 行并将它们取消嵌套到单独的行中。

WITH data(ts, value) AS (
    VALUES
        (from_iso8601_timestamp('2023-02-02T17:34:55.946Z'), VARCHAR '{"ETL_table_1":true,"ETL_table_2":true}'),
        (from_iso8601_timestamp('2023-02-02T13:30:11.882Z'), VARCHAR '{"ETL_table_3":true}'),
        (from_iso8601_timestamp('2023-02-02T20:12:22.116Z'), VARCHAR '{"ETL_table_4":true,"ETL_table_5":true,"ETL_table_6":false}')

)
SELECT ts, t.name, t.value
FROM data, UNNEST(CAST(json_parse(json_query(value, 'strict $.keyvalue()' WITH ARRAY WRAPPER)) AS array(row(name varchar, value boolean)))) t(name, value)
© www.soinside.com 2019 - 2024. All rights reserved.