我有一组历史数据表,它们具有不同但"兼容"的模式。我的意思是,随着时间的推移,架构已经发展,并且添加了(而不是删除)了更多的字段。我喜欢对所有的联合进行查询。
使用legacy SQL
执行此操作需要多个SELECT
语句,这些语句由早期表中不存在的新字段的UNION
和虚拟 NULL 占位符连接。 我有 100 个这样的组合查询要构建和执行。
我可以编写这个脚本,但希望改用Standard SQL
通配符表。然而,我在 https://cloud.google.com/bigquery/docs/reference/legacy-sql#tablewildcardfunctions 读到:
为了执行使用通配符表的标准 SQL 查询, BigQuery 会自动推断该表的架构。BigQuery 使用 最近创建的表的架构,该架构与 通配符作为通配符表的架构。如果架构是 与通配符表匹配的表之间不一致,BigQuery 返回错误。
不确定有多严格意味着不一致。它是否支持上述用例的增量模式,还是所有表都需要共享完全相同的架构?
如果不可能,另一种选择是使用 schemaUpdateOptionsALLOW_FIELD_ADDITION
从源(重新)加载到新表中。这意味着重新设计和返工。
欢迎任何其他建议。仅供参考 - 我使用 Airflow 来执行查询,所以我宁愿使用 Pythonic 解决方案。
BigQuery API 具有patch tables
功能,您可以在其中使用新结构添加的架构更改修补/扩展所有旧表。
通过修补旧表,您只需将 NULL 之类的列添加到过去的架构中,数据不会被删除。
因此,您需要做的是编写一个脚本,该脚本采用最新的架构,并将所有以前的表增量修补到新架构,然后您可以运行UNION
查询。
相关:如何使用 BigQuery 补丁?