基于字段位置而非名称的 BigQuery 联合架构

Posted

技术标签:

【中文标题】基于字段位置而非名称的 BigQuery 联合架构【英文标题】:BigQuery union schema based on field location and not name 【发布时间】:2019-05-15 07:35:52 【问题描述】:

有没有办法运行 BigQuery 联合查询并使架构取决于字段名称而不是字段位置。以下查询的结果并不直观,因为字段在基础表中的顺序不同,所以它们被转置了。

with table1 as (
  select 
    '1' as field_1,
    '2' as field_2
),

table2 as (
  select 
    '2' as field_2,
    '1' as field_1
)


select * from table1
union all 
select * from table2

查询结果

【问题讨论】:

【参考方案1】:

无论表是如何定义的,您都可以按名称以适当的顺序选择列:

SELECT
  field_1,
  field_2
FROM table1
UNION ALL
SELECT
  field_1,
  field_2
FROM table2

不过,最好只对基础表中的列重新排序:

CREATE OR REPLACE table2 AS
SELECT
  field_1,
  field_2
FROM table2

那么你有一个一致的列顺序。

【讨论】:

这里的表格只是示例。我想使用“select *”进行联合,而真正的底层表有一个巨大的嵌套模式,所以重新排序它们是一件很痛苦的事情。为什么联合基于列位置而不是列名? 这就是联合在所有主要查询引擎中的工作方式,而不仅仅是 BigQuery。根据 SQL 标准,列按位置关联。

以上是关于基于字段位置而非名称的 BigQuery 联合架构的主要内容,如果未能解决你的问题,请参考以下文章

bigquery:依靠子查询的联合

如何将嵌套字段添加到我的 BigQuery 表架构?

BigQuery:对具有不同字段顺序的重复字段进行联合

Bigquery - 在 CSV(联合表)中处理双引号和管道字段分隔符

JSON 表架构到 bigquery.TableSchema 用于 BigQuerySink

bigquery 嵌套对象:没有这样的字段