1

我在 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我想创建一个嵌套字段,其中我有关键字、相应的数组和相应数组的长度。

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

+------------+----------------+---------------+-------------------+
|  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 函数,但我不确定在倒排索引中访问关键字和与它们对应的数组的键是什么。

4

1 回答 1

3

以下是 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 
于 2019-07-20T05:29:19.240 回答