查询字符串数组 JSON

Query String Array JSON

我在 Athena 中有一个 table,其中数据摄取是通过 MongoDB 完成的,其中 table 的列是 JSON 的数组。

只有 table 列是一个字符串,我不知道如何 运行 查询。

+--------+---------------------------------------------------------------------------------------------------------------------------------------+
| client | information                                                                                                                           |
+--------+---------------------------------------------------------------------------------------------------------------------------------------+
| 1      | [ { "ProductId" : { "$binary" : "7KgRQKabqkuxE+1pSw9b7Q==", "$type" : "03" }, "Risk" : "0", "Due_data" : { "$date" : 1634860800000 } ]|
+--------+---------------------------------------------------------------------------------------------------------------------------------------+

我想知道我是否可以 运行 查询离开 table 像这样

+--------+-------------------------------------------------------------------+
| client | ProductId                            | Risk | Due_data            |
+--------+-------------------------------------------------------------------+
| 1      | 4011A8EC-9BA6-4BAA-B113-ED694B0F5BED | 0    | 2021-12-08 00:00:00 |
+--------+-------------------------------------------------------------------+

谢谢

使用数组并不容易,因为 presto 不完全支持 jsonpath。如果你保证数组中只有一个元素,你可以做类似 json_extract_scalar(json, '$[0].ProductId["$binary"]') 的事情来提取字段,否则你可以将 json 转换为 json 的数组并使用它:

-- sample data
WITH dataset (client, information) AS (
    VALUES (1, '[ { "ProductId" : { "$binary" : "7KgRQKabqkuxE+1pSw9b7Q==", "$type" : "03" }, "Risk" : "0", "Due_data" : { "$date" : 1634860800000 }} ]')
) 

--query
SELECT client,
    r.product_id,
    r.risk,
    r.ts
FROM dataset
    CROSS JOIN UNNEST(
        transform(
            cast(json_parse(information) as array(json)), -- parse json and treat as array of json
            json->cast( -- transform concrete json to row
                ROW(
                    json_extract_scalar(json, '$.ProductId["$binary"]'),
                    json_extract_scalar(json, '$.Risk'),
                    from_unixtime(
                        cast(
                            json_extract_scalar(json, '$.Due_data["$date"]') AS BIGINT
                        ) / 1000 -- transform timestamp to date
                    )
                ) as ROW(product_id VARCHAR, risk INT, ts TIMESTAMP)
            )
        )
    ) as t(r)

输出:

client product_id risk ts
1 7KgRQKabqkuxE+1pSw9b7Q== 0 2021-10-22 00:00:00.000

请注意,这不处理 product_id 转换 - 此处您需要提供您的逻辑。