旧版 sql 和标准 sql 之间的 BigQuery 表分区差异

Posted

技术标签:

【中文标题】旧版 sql 和标准 sql 之间的 BigQuery 表分区差异【英文标题】:BigQuery table partitioning difference between legacy and standard sql 【发布时间】:2017-03-22 06:06:38 【问题描述】:

当使用--time_partitioning_type=DAY 命令行参数对 BigQuery 表进行分区时...

    它是创建单个物理表还是多个物理表?使用标准 SQL 与旧版 SQL 时是否有所不同 伪列 _PARTITIONTIME 在旧版 SQL 和标准 SQL 中都可用吗? 由于标准 SQL 不支持 Partition Decorator ,如何克服使用标准 SQL 的限制?

【问题讨论】:

【参考方案1】:
    它是创建一个物理表还是多个物理表?在使用标准 SQL 与旧版 SQL 时是否有所不同

BigQuerys 内部系统是分布式的,因此它确实是 Google 基础架构内相同数据的多个物理副本。由于它是一项托管服务,因此对我们来说是透明的。

    伪列 _PARTITIONTIME 在旧版 SQL 和标准 SQL 中都可用吗?

是的,它可用。更多关于在examples 中放置此伪列的位置。

    由于标准 SQL 不支持 Partition Decorator ,如何克服使用标准 SQL 的限制?

纯 SQL 中的装饰器可以用 _PARTITIONTIME 伪列来模仿。将装饰器视为该服务 API 方面的补充发明。当您需要删除一天并将该天重新加载到您的表中时,您无法使用 SQL 轻松做到这一点,但使用 API 和装饰器您可以运行 bq rm 'mydataset.table$20160301'。分区装饰器使您能够将数据加载到特定分区中:[TABLE_NAME]$20160301

【讨论】:

谢谢,我还想知道是否在分区的情况下创建了多个分片物理表,还是为了可靠性而复制的单个整体表? 正如 Pentium10 所说,表是否物理分片是实现细节,应该与用户无关。从逻辑上讲,您可以认为该表是分片的。当您查询分区表时,只会读取相关分区并且您只需为此付费。对于非分区表,您始终需要为整个表付费。【参考方案2】:

对于 3. - 装饰器现在实现如下:

SELECT *
FROM t
  FOR SYSTEM TIME AS OF '2017-01-01 10:00:00-07:00';
https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax

【讨论】:

以上是关于旧版 sql 和标准 sql 之间的 BigQuery 表分区差异的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 中用于 Google Analytics 数据的标准 SQL 还是旧版 SQL?

在 BigQuery 中使用 dryRun 区分标准和旧版 SQL 查询的替代方法?

如何将旧版 SQL BigQuery 转换为标准 SQL?

标准 sql 中的 bigquery 旧版 sql POSITION() 函数

无法在 Google BigQuery 中将此旧版 SQL 转换为标准 SQL

从旧版 SQL 迁移:使用标准 SQL 的“WITHIN RECORD”选项