根据 BigQuery 重复记录中的字段计算聚合

Posted

技术标签:

【中文标题】根据 BigQuery 重复记录中的字段计算聚合【英文标题】:Calculate aggregates based on fields in BigQuery's repeated records 【发布时间】:2021-08-25 16:25:32 【问题描述】:

"outer_1": "1",
"outer_2": 2,
"inner": [
  
    "inner_1": 0,
    "inner_2": null,
    ,
  
    "inner_1": 3,
    "inner_2": true,
  ,
 ]

在上面你可以大致看到我的数据是什么样子的。对于 BigQuery,inner 是重复记录。我想计算每一行的聚合(例如非空 inner_1 字段的总和)。

一个想法是使用unnest(inner),计算聚合,然后按所有其他列分组。然而,这似乎不是最佳方法。我已经有大约一百万行了。取消嵌套会创建更多的行,并且立即进行聚合以对所有内容进行分组听起来不正确。

我敢打赌,可能有一种更有效的方法来迭代嵌套记录并为它们计算聚合。

最后,我想要这样的东西:

    
"outer_1": "1",
"outer_2": 2,
"inner_1_sum: 3, 
"inner_2_non_null_count": 1

【问题讨论】:

【参考方案1】:

考虑以下方法

select * except(inner_col),
  ( select as struct 
      sum(inner_1) as inner_1_sum,
      countif(not inner_2 is null) as inner_2_non_null_count
    from unnest(inner_col)
  ).*
from `project.dataset.table`        

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

【讨论】:

非常感谢。这正是我想要达到的目标。我只是注意到使用select as structselect struct(带有额外的括号)会产生类似的结果,除了命名。文档似乎没有明确提及差异,您能否简要说明一下? 您可以使用struct<name1 TYPE1, name2 TYPE2>(value1, value2) 来识别您想要的列名。在您上面的情况下,它可以是select struct<inner_1_sum INT64, inner_2_non_null_count INT64>(sum(inner_1), countif(not inner_2 is null)) from unnest(inner_col)。同时,很高兴它对你有用,如果还没有,也可以考虑投票:o) 我赞成并接受了您的回答 ;-) 令人惊讶的是,select struct(sum(inner_1) as inner_1_sum, countif(not inner_2 is null) as inner_2_non_null_count) 也可以按需要工作。对吗? 是的。没有惊喜。 struct 的这个概念也记录在案并且有效:o) 非常感谢! BigQuery 的灵活性及其允许您做的事情确实令人印象深刻 :)

以上是关于根据 BigQuery 重复记录中的字段计算聚合的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:聚合到不同的重复字段

BigQuery:如何从重复记录中仅提取某些字段作为另一个重复字段

重复字段的 BigQuery 记录

如何根据bigquery中另一列中的重复值计算一列

BigQuery - 具有范围聚合的查询中的重复行

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