BigQuery 从嵌套数组中选择和别名字段而不分组

Posted

技术标签:

【中文标题】BigQuery 从嵌套数组中选择和别名字段而不分组【英文标题】:BigQuery select and alias field from nested array without grouping 【发布时间】:2020-01-09 03:08:27 【问题描述】:

我在 BigQuery 表中有一些数据,其中一个字段是结构数组。我试图基本上做一个SELECT *,但为数组中的嵌套字段设置别名。这是一个简单的例子:

with array_of_records as (
  select
    'field1' as regular_field,
    [struct ('arr_1a' as field_1, 'arr_1b' as field_2), struct ('arr_2a' as field_1, 'arr_2b' as field_2)] as array_field
)

select
  regular_field,
  array_agg (
    struct (
      array_entry.field_1 as field_a,
      array_entry.field_2 as field_b
    )
  ) as array_field
from array_of_records, unnest(array_field) array_entry
group by 1

有没有办法不用array_agggroup_by 来做到这一点?我之所以问是因为该表有大量字段,并且我想避免除嵌套数组字段之外的所有字段进行分组。我意识到我也可以用 any_value() 之类的东西聚合每一列,但这似乎也不是一个特别干净的解决方案。

【问题讨论】:

【参考方案1】:

我确实从经验中知道,将其作为子查询进行可能是一个巨大的胜利:

select regular_field,
       (SELECT array_agg(struct(array_entry.field_1 as field_a, array_entry.field_2 as field_b))
        FROM  unnest(ar.array_field) array_entry
       ) as array_field       
from array_of_records ar;

这避免了“全局”聚合,因此数据不必在大量节点之间移动。

【讨论】:

@PrratekRamchandani 。 . .凉爽的。大约一年前我遇到过类似的问题,并认为这个简单的更改会产生很大的影响。

以上是关于BigQuery 从嵌套数组中选择和别名字段而不分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在BigQuery中创建嵌套字段和数组的数组

如何在存储为字符串的 bigquery 字段中取消嵌套多个数组?

BigQuery:从多个嵌套列中选择 * 替换

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

根据 BigQuery 中嵌套字段的不同值选择行

BigQuery UPDATE 嵌套数组字段