【发布时间】:2022-01-09 08:08:57
【问题描述】:
我目前正在将我的数据仓库迁移到 BigQuery。我一直在尝试对数据库进行非规范化,因为我已经读到它可以产生更有效和更便宜的查询。但是,这导致了许多嵌套表。如果每个嵌套表都有一个列“created_at”和“last_modified_at”,有什么方法可以使用这些值中的任何一个来对我的表进行分区?
【问题讨论】:
标签: google-bigquery partitioning denormalization
我目前正在将我的数据仓库迁移到 BigQuery。我一直在尝试对数据库进行非规范化,因为我已经读到它可以产生更有效和更便宜的查询。但是,这导致了许多嵌套表。如果每个嵌套表都有一个列“created_at”和“last_modified_at”,有什么方法可以使用这些值中的任何一个来对我的表进行分区?
【问题讨论】:
标签: google-bigquery partitioning denormalization
不,您不能通过嵌套表对表进行分区。根据the docs:
您可以通过以下方式对 BigQuery 表进行分区:
时间单位列:表根据 TIMESTAMP、DATE、 或表中的 DATETIME 列。
摄取时间:表根据时间戳进行分区 BigQuery 会提取数据。
整数范围:基于整数列对表进行分区。
此外,分区必须是顶级字段,不能是 RECORD (STRUCT) 中的叶字段:
限制
您不能使用旧版 SQL 来查询分区表或 将查询结果写入分区表。
时间单位列分区表受以下约束 限制:
分区列必须是标量 DATE、TIMESTAMP 或 日期时间列。虽然列的模式可以是 REQUIRED 或 NULLABLE,它不能重复(基于数组)。分区列 必须是顶级字段。您不能使用 RECORD 中的叶字段 (STRUCT) 作为分区列。
整数范围分区表 受到以下限制:
分区列必须是 INTEGER 列。而模式 该列可能是 REQUIRED 或 NULLABLE,不能重复 (基于数组)。分区列必须是顶级字段。你 不能使用 RECORD (STRUCT) 中的叶字段作为分区 列。
虽然您可以在 BigQuery 中对聚集表使用更多数据类型,但不能使用 RECORD (STRUCT) 列对表进行聚集:
集群列必须是顶级的、非重复的列之一 以下类型:
DATE BOOL GEOGRAPHY INT64 NUMERIC BIGNUMERIC STRING TIMESTAMP DATETIME
如果您进行分区的原因是为了提高日期/时间查询的效率,并且如果每个嵌套表涵盖相似的时间范围,我建议将表取消嵌套到父表中。如果您不想取消嵌套表,则将另一列添加到主表中可能会有所帮助,其中包含嵌套表中最早或最晚的日期并按新列进行分区。
【讨论】: