查询字符串数组 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
转换 - 此处您需要提供您的逻辑。
我在 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
转换 - 此处您需要提供您的逻辑。