我的表中有两个
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
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)