旧版 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 POSITION() 函数