[英]Athena UNNEST array into column values
WITH key_value AS
(
SELECT e
FROM headers
CROSS JOIN UNNEST(CAST(json_parse(headers) AS array(json))) t(e)
)
SELECT
CAST(JSON_PARSE(e) AS map(varchar, varchar)) AS value
FROM
key_value
{
"headers": [{
"key": "Name",
"value": "xxxx"
},
{
"key": "Email",
"value": "xxxx"
},
{
"key": "ID",
"value": "1234"
},
{
"key": "Company",
"value": "XYZ"
},
{
"key": "Groups",
"value": "[]"
},
{
"key": "Address",
"value": "xxxx"
},
{
"key": "State",
"value": "Log In"
},
{
"key": "Component",
"value": "xxxx"
},
{
"key": "LastUsed",
"value": "xxxx"
}]
}
到目前为止,我已经尝试过这段代码,第一部分似乎有效,它似乎给了我最内在的 JSON 对象,但可以将它们转换为单独的列对象。
我需要将每个标题数组变成一行,其中键作为列,值作为数据。
您可以将第二个unnest
(注意简洁语法)应用于 map,它将数据展平到列中:
SELECT k, v
FROM key_value,
unnest(CAST(e AS map(varchar, varchar))) as t(k, v)
WITH key_value AS
(
SELECT "$path" as ID,
e
FROM headers
CROSS JOIN UNNEST(CAST(json_parse(headers) AS array(json))) t(e)
),
ID_key_value AS(
SELECT regexp_extract(ID, '(^|\D)(\d{10})(\D|$)', 2) AS ID,
json_extract_scalar(e,'$.key') AS Key,
json_extract_scalar(e,'$.value') AS Value
FROM key_value)
SELECT
ID,
kv['Name'] AS Name,
kv['Email'] AS Email,
kv['EId'] AS EId,
kv['Company'] AS Company,
kv['Groups'] AS Groups,
kv['Address'] AS Address,
kv['State'] AS State,
kv['Component'] AS Component,
kv['LastUsed'] AS LastUsed
FROM (
SELECT ID, map_agg(Key, Value) kv
FROM ID_key_value
GROUP BY ID
)
;
上面的查询对我有用,首先 select 将所有 JSON 键值对取消嵌套到单独的行中,第二个 select 只是 select 键和值作为数据,第三个 select 根据键值将每个 ID 转换为单个行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.