根据 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 struct
和select 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 重复记录中的字段计算聚合的主要内容,如果未能解决你的问题,请参考以下文章