繁体   English   中英

Athena UNNEST 数组转换为列值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM