从json文档中没有指定键的bigquery中的json字符串中提取键和值

时间:2019-07-20 02:23:42

标签: json google-bigquery json-extract

我在bigquery中有一个表,其中有一个对象,每个对象都有一些字符串化的json。在json中,示例行如下所示:

{
    "ObjectID": "1984931229",
    "indexed_abstract": "{\"IndexLength\":123,\"InvertedIndex\":{\"Twenty-seven\":[0],\"metastatic\":[1,45],\"breast\":[2],\"adenocarcinoma\":[3],\"patients,\":[4]}}" 
}

indexed_abstract中的某个地方,我们有一个InvertedIndex,其中包含一些关键字以及这些关键字在ObjectID中出现了多少次。

现在,我想通过使用bigquery解析json来访问字符串化的json,对于每个ObjectID,我想创建一个嵌套字段,其中包含关键字,相应的数组和相应的数组的长度。 / p>

例如,在这种情况下,输出将如下所示:

+------------+----------------+---------------+-------------------+
|  ObjectID  |  keyword.key   | keyword.count | keyword.positions |
+------------+----------------+---------------+-------------------+
| 1984931229 | Twenty-seven   |             1 | [0]               |
|            | metastatic     |             2 | [1,45]            |
|            | breast         |             1 | [2]               |
|            | adenocarcinoma |             1 | [3]               |
|            | patients       |             1 | [4]               |
+------------+----------------+---------------+-------------------+

我知道我可以使用JSON_EXTRACT函数,但是我不确定在反转索引中访问关键字和与之对应的数组的关键是什么。

1 个答案:

答案 0 :(得分:1)

以下是用于BigQuery标准SQL

#standardSQL
SELECT ObjectID, 
  ARRAY(
    SELECT AS STRUCT 
      key, 
      ARRAY_LENGTH(SPLIT(value)) `count`, 
      value positions 
    FROM UNNEST(REGEXP_EXTRACT_ALL(JSON_EXTRACT(indexed_abstract, '$.InvertedIndex'), r'"[^"]+":\[[\d,]*?]')) pair,
    UNNEST([STRUCT(REPLACE(SPLIT(pair, ':')[OFFSET(0)], '"', '') AS key, SPLIT(pair, ':')[OFFSET(1)] AS value)])
  ) keyword
FROM `project.dataset.table`

如果要应用于您的问题的样本数据-结果为

Row ObjectID    keyword.key     keyword.count   keyword.positions    
1   1984931229  Twenty-seven    1               [0]  
                metastatic      2               [1,45]   
                breast          1               [2]  
                adenocarcinoma  1               [3]  
                patients        1               [4]  
  

关于Op的评论的最新信息-我想知道我是否想将位置设置为数组(重复的字段),我该怎么做?

更改只需一行即可

  SPLIT(REGEXP_REPLACE(value, r'\[|]', '')) positions