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

Posted

技术标签:

【中文标题】如何取消嵌套存储为字符串的 bigquery 字段?【英文标题】:How to unnest bigquery field that is stored as a string? 【发布时间】:2019-01-18 17:55:22 【问题描述】:

我正在尝试取消嵌套字段,但我的查询有问题。

我的表中的示例数据

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

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

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

#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】:

以下是 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     

【讨论】:

其实你的第二个例子就是我需要的那个。我将如何提取每个项目的数量、产品 ID?是否可以先 UNNEST 项目然后 UNNEST 类别? 当然。请发布新问题,我(或其他人)会回答:o) ***.com/questions/54296844/…@Mikhail

以上是关于如何取消嵌套存储为字符串的 bigquery 字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中取消嵌套多个数组?

取消嵌套存储在列中的 JSON 字符串 [BigQuery]

在 BigQuery 中取消嵌套多个嵌套字段

无法使用 google bigquery(标准)取消嵌套某些字段

Bigquery:UNNEST 重复与展平表性能

查询 Bigquery 重复字段