我想用 BigQuery 提取 Json 格式的数据。 UDF 或 json_extract
Posted
技术标签:
【中文标题】我想用 BigQuery 提取 Json 格式的数据。 UDF 或 json_extract【英文标题】:I want to extract Json format data with BigQuery. UDF or json_extract 【发布时间】:2020-01-21 17:00:58 【问题描述】:我有一个具有以下结构的表。
user_id 整数,
purchase_ids 字符串(Json 格式)
此表的一条记录中包含的 JSON 如下所示:
user_id = 0001
1:
shop_id:1,
product_id :1111,
value: 1
,
2:
shop_id:1,
product_id :2222,
value: 1
,
3:
shop_id:1,
product_id :3333,
value: 1
,
.... Numbers fluctuate as records approach
目标的最终输出
| user_id | shop_id | product_id | value |
| 0001 | 1 | 1111 | 1 |
| 0001 | 1 | 2222 | 1 |
| 0001 | 1 | 3333 | 1 |
我在思考时尝试了以下查询,但似乎没有正确完成 shop_id 和 product_id 返回 null。
CREATE TEMP FUNCTION jsonparse(json_row STRING)
RETURNS STRING
LANGUAGE js AS """
var res = array();
json_row.forEach(([key, value]) =>
res = value;
);
return res
""";
with
parse as(
select
user_id,
jsonparse(purchase_ids) as pids
from
sample
)
select
user_id,
JSON_EXTRAXT(pid,"$.shop_id") as shop_id,
JSON_EXTRAXT(pid,"$.product_id") as product_id
from
parse,
unnest(pids,",") pid
在这种情况下你如何做到正确?
【问题讨论】:
【参考方案1】:以下是您的用例的工作版本(BigQuery 标准 SQL)
#standardSQL
CREATE TEMP FUNCTION jsonparse(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
return JSON.parse(input).map(x=>JSON.stringify(x));
""";
WITH sample AS (
SELECT "0001" AS user_id,
'''["shop_id": 1, "product_id" :1111, "value": 1,
"shop_id": 1, "product_id" :2222, "value": 1,
"shop_id": 1, "product_id" :3333, "value": 1]''' AS purchase_ids
), parse AS (
SELECT user_id,
jsonparse(purchase_ids) AS pids
FROM sample
)
SELECT
user_id,
JSON_EXTRACT(pid,"$.shop_id") AS shop_id,
JSON_EXTRACT(pid,"$.product_id") AS product_id,
JSON_EXTRACT(pid,"$.value") AS value
FROM parse,
UNNEST(pids) pid
结果
Row user_id shop_id product_id value
1 0001 1 1111 1
2 0001 1 2222 1
3 0001 1 3333 1
【讨论】:
这是我要问的答案!【参考方案2】:在我看来,您的用例需要使用可以用 json 结构表示的a NESTED and REAPEATED column。例如,以下查询返回您要查找的结果:
WITH users AS
(SELECT "0001" as user_id, ARRAY<STRUCT<shop_id INT64, product_id INT64, value INT64>>[(1, 1111,1),
(1, 2222,1), (1, 3333,1)] AS shops)
SELECT u.user_id, s.*
FROM users u, UNNEST(shops) s;
为简单起见,您可以通过关注this guide 从控制台创建此类列以尝试此方法。
【讨论】:
以上是关于我想用 BigQuery 提取 Json 格式的数据。 UDF 或 json_extract的主要内容,如果未能解决你的问题,请参考以下文章