如何取消嵌套作为字符串存储的bigquery字段?

时间:2019-01-18 17:55:23

标签: google-bigquery unnest

我正在尝试取消一个字段的嵌套,但是我的查询出了点问题。

在我的表格中采样数据

'1234', '{ "id" : "123" , "items" : [ { "quantity" : 1 , "product" : { "id" : "p1" , "categories" : [ "cat1","cat2","cat3"]  }}] }'

数据集中有2个字段:row_id和parts,其中parts是其中包含列表项(类别)的字典对象,而part的数据类型是字符串。我希望输出是每个类别的单独行。

这是我尝试过的方法,但没有得到任何结果。

#standardSQL
with t as (
select "1234" as row_id, '{ "id" : "123" , "items" : [ { "quantity" : 1 , "product" : { "id" : "p1" , "categories" : [ "cat1","cat2","cat3"]  }}] }' as parts 
)
select row_id, _categories
from t,
UNNEST(REGEXP_EXTRACT_ALL(JSON_EXTRACT(parts, '$.items'), r'"categories":"(.+?)"')) _categories

预期结果

id, _categories
1234, cat1
1234, cat2
1234, cat3

1 个答案:

答案 0 :(得分:2)

以下是用于BigQuery标准SQL

   
#standardSQL
WITH t AS (
  SELECT "1234" AS row_id, '{ "id" : "123" , "items" : [ { "quantity" : 1 , "product" : { "id" : "p1" , "categories" : [ "cat1","cat2","cat3"]  }}] }' AS parts 
)
SELECT row_id, REPLACE(_categories, '"', '') _categories
FROM t, UNNEST(SPLIT(REGEXP_EXTRACT(
  JSON_EXTRACT(parts, '$.items'), 
  r'"categories":\[(.+?)]'))
) _categories 

并产生预期结果

Row row_id  _categories  
1   1234    cat1     
2   1234    cat2     
3   1234    cat3      
  

更新

上述解决方案主要集中在修复提取物中使用的正则表达式上,但没有解决具有多个产品的更通用的情况。下面的解决方案解决了这种更常见的情况

#standardSQL
WITH t AS (
  SELECT "1234" AS row_id, '''{ "id" : "123" , "items" : [ 
      { "quantity" : 1 , "product" : { "id" : "p1" , "categories" : [ "cat1","cat2","cat3"]  }},
      { "quantity" : 2 , "product" : { "id" : "p2" , "categories" : [ "cat4","cat5","cat6"]  }}
    ] }''' AS parts 
)
SELECT row_id, REPLACE(category, '"', '') category
FROM t, UNNEST(REGEXP_EXTRACT_ALL(parts, r'"categories" : \[(.+?)]')) categories,
UNNEST(SPLIT(categories)) category  

有结果

Row row_id  category     
1   1234    cat1     
2   1234    cat2     
3   1234    cat3     
4   1234    cat4     
5   1234    cat5     
6   1234    cat6