如何在 bigquery 标准 sql 中展平结构?

Posted

技术标签:

【中文标题】如何在 bigquery 标准 sql 中展平结构?【英文标题】:How to flatten a struct in bigquery standard sql? 【发布时间】:2017-08-24 15:43:19 【问题描述】:

通过以下标准 sql 查询,我可以在 BigQuery 中返回一个结构表,其中包含来自 a 和 b 的所有字段。

SELECT a, b
FROM first_table a
JOIN second_table b
ON a.key = b.key;

生成的表架构将 a 作为 RECORD,b 作为 RECORD,其中 a.field1、a.field2、b.field1、b.field2 等都有其原始类型。

如果我将此表保存为 a_join_b,然后在 legacy_sql 中查询:

SELECT *
FROM a_join_b
;

它将展平结构并提供一个表,其中包含名为 a_field1、a_field2、...、b_field1、b_field2 的字段。注意表名和字段名之间的下划线,a 和 b 可以有相似的字段名。

BigQuery 标准 SQL 中有没有一种方法可以在不引用单个记录名称的情况下展平表?我查看了How to convert a nested flatten into Standard SQL 中的 UNNEST,但解决方案似乎需要加入必须命名的未嵌套字段。

【问题讨论】:

【参考方案1】:

如果ab没有数组,那很简单:

SELECT *
FROM first_table a
JOIN second_table b
USING (key)

SELECT a.*, b.* EXCEPT (key)
FROM first_table a
JOIN second_table b
ON a.key = b.key

如果它们确实包含数组,那么它取决于它们的布局(UNNEST 仅指数组,所以我怀疑它们可能)。如果可以,你能澄清一下表格的布局吗?

【讨论】:

谢谢,但这些查询不会预先添加表名 a 和 b。此外,如果 a 和 b 具有相同名称的字段,它们也不起作用。错误:不支持结果中的重复列名。这些表不包含数组。考虑查询:#standardSQL WITH first_table AS ( SELECT 777 AS key, 1 AS x, 2 AS y, 3 AS z ), second_table AS ( SELECT 777 AS key, 4 AS x, 5 AS y, 6 AS z ) SELECT * FROM first_table AS a JOIN second_table AS b USING (key) 你想从这个例子中得到什么结果? Mikhail Berlyant 在回复“有没有办法在 BigQuery 标准 SQL 中添加连接的表名?”时提供了公认的解决方案。堆栈中的问题:***.com/questions/45692560/… .

以上是关于如何在 bigquery 标准 sql 中展平结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何将动态 json 键展平为 BigQuery 中的列?

在 BigQuery 中展平嵌套层次结构

BigQuery 在同一查询中展平 GA 会话和命中级别字段

在新的 BigQuery 标准 SQL 的数组中使用结构

BigQuery 中记录类型与展平表的查询性能

查询 Bigquery 重复字段