我想用 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的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery JSON 提取函数

如何替换 BigQuery 中 JSON 中特定键的数据?

以 JSON 格式下载大查询表

选择/提取 JSON 元素时的高效 BigQuery

BigQuery - 将通用 JSON 转换为 STRUCT

从带有键名的 JSON 中提取值在 bigquery 中包含 #