如何在 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】:如果a
和b
没有数组,那很简单:
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 中展平结构?的主要内容,如果未能解决你的问题,请参考以下文章