Bigquery:是不是有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值?

Posted

技术标签:

【中文标题】Bigquery:是不是有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值?【英文标题】:Bigquery: Is there a json path way to extract only values ​from a json array with dynamic keys?Bigquery:是否有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值? 【发布时间】:2021-11-01 09:01:04 【问题描述】:

规格如下。

字段值为json数组。 每个 json 元素都有一个动态键。 提取数组的所有值

[示例]

WITH TempTable AS
 (SELECT '1' as id, '["1_03":8,"1_04":8]' as target  UNION ALL
  SELECT '2', '["1_19":8,"1_08":9]' UNION ALL
  SELECT '3', '["1_23":4,"1_24":6]'
  )
SELECT 
    id,
    json_query_array(target,'$'),
    REGEXP_EXTRACT_ALL(target, '"(.*?)":') as key,
    REGEXP_EXTRACT_ALL(target, ':([0-9]+)') as val
FROM TempTable

对于带有json数组的字段(在示例中),我只能用正则表达式提取值。

但是,有没有办法应用json路径方法?

【问题讨论】:

只提取一个值是什么意思?在您的示例中,您似乎正在提取数组的所有值。 @DanielZagales 你说的是对的。文本内容已明确修改。 (提取数组的所有值) 【参考方案1】:

考虑以下方法

SELECT id, element,
  kv[OFFSET(0)] as key,
  kv[OFFSET(1)] as value
FROM TempTable, 
UNNEST(JSON_EXTRACT_ARRAY(target)) element,
UNNEST([STRUCT(SPLIT(TRANSLATE(element, '"', ''), ':') as kv)])     

如果应用于您问题中的样本数据 - 输出是

如果您想保留行 - 请使用以下版本

SELECT id, ARRAY( 
    SELECT AS STRUCT
      element,
      kv[OFFSET(0)] as key,
      kv[OFFSET(1)] as value,    
    FROM UNNEST(JSON_EXTRACT_ARRAY(target)) element,
    UNNEST([STRUCT(SPLIT(TRANSLATE(element, '"', ''), ':') as kv)]) 
  ) AS output
FROM TempTable

在这种情况下 - 输出是

【讨论】:

非常有帮助。我很感激。

以上是关于Bigquery:是不是有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值?的主要内容,如果未能解决你的问题,请参考以下文章

将 csv 数据发布/订阅到 Dataflow 到 BigQuery

从 BigQuery 列中提取 Json 值

使用控制台将多条 JSON 记录加载到 BigQuery

BigQuery - JSON_EXTRACT 仅提取第一个条目

bigquery url 解码

Apache Beam 批量到 BigQuery,中间文件,它们是不是仅以 JSON 格式生成