旧版 SQL 中的表修饰器

本文档详细介绍了如何使用旧版 SQL 查询语法中的表修饰器。 BigQuery 的首选查询语法是标准 SQL。目前,标准 SQL 不支持表修饰器,但您可以通过对 _TABLE_SUFFIX 伪列使用过滤条件,在标准 SQL 中实现表修饰器语义。如需了解详情,请参阅标准 SQL 迁移指南中的表修饰器和通配符函数

通常,BigQuery 会在运行查询时执行全面列扫描。 您可以使用旧版 SQL 中的表修饰器来对部分数据执行经济有效的查询。无论何时读取表(例如复制表、导出表或使用 tabledata.list 列出数据时),您都可以使用表修饰器。

表修饰器支持相对和绝对 <time> 值。相对值用负数表示,绝对值用正数表示。例如,-3600000 表示相对于当前时间的一个小时以前(以毫秒为单位);3600000 表示 1970 年 1 月 1 日之后的一个小时(以毫秒为单位)。

快照修饰器

语法

@<time>
  • 引用 <time>(以毫秒为单位,从 Epoch 起算)时间点的表快照。
  • <time> 必须在最近 7 天范围内,且不得早于表的创建时间。
  • @0 是一种特殊情况,它引用表可以获得的最早的快照:7 天前对应时间的快照,或者表的创建时间对应的快照(如果表的创建时间少于 7 天)。
  • 快照修饰器仅在表复制操作中受支持。对于查询操作,请使用 FOR SYSTEM_TIME AS OF

表删除后的 7 天内,您可以使用快照修饰器恢复删除的表

示例

如需获取一小时前对应的表快照,请按如下所示操作:

相对值示例

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-3600000]

绝对值示例

  1. 获取一小时前对应的 <time>

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
    
  2. 然后,替换以下查询中的 <time>

    #legacySQL
    SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@time]
    

如需使用快照修饰器和 bq 命令行工具恢复删除的表,请执行以下操作:

恢复删除的表示例

首先,确定删除表之前的时间戳(以毫秒为单位,从 Epoch 起算)。然后,将该时间戳的表复制到新表。 新表不得采用已删除表的名称。

# Create a table "dataset1.table1"
$ bq query --destination_table=dataset1.table1 "select 1"

# Get current timestamp
$ date +%s%3N
1573060348222

# Delete table1
$ bq rm dataset1.table1

# Undelete table
$ bq cp dataset1.table1@1573060348222 dataset1.table1_restore

恢复删除的数据集示例

首先,确定删除数据集之前的时间戳(以毫秒为单位,从 Epoch 起算)。然后,将数据集中该时间戳的表复制到这个表中。

# Create a table "dataset1.table1"
$ bq query --destination_table=dataset1.table1 "select 1"

# Get current timestamp
$ date +%s%3N
1573060348222

# Remove the dataset
$ bq rm -f -r dataset1

# Restore step1: re-create the dataset with same name
$ bq mk dataset1

# Restore step2: undelete the table.
$ bq cp dataset1.table1@1573060348222 dataset1.table_new

范围修饰器

语法

@<time1>-<time2>
  • 引用 <time1><time2>(以毫秒为单位,从 Epoch 起算)期间添加的表数据。
  • <time1><time2> 必须在过去 7 天内。
  • <time2> 是可选项,默认值为“now”。

示例

相对值示例

如需获取一小时前到半小时前之间添加的表数据,请运行以下命令:

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-3600000--1800000]

如需获取最近 10 分钟的数据,请运行以下命令:

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-600000-]

绝对值示例

如需获取一小时前到半小时前之间添加的表数据,请运行以下命令:

  1. 获取一小时前对应的 <time1>

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
    
  2. 获取半小时前对应的 <time2>

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -30, 'MINUTE')/1000)
    
  3. 替换以下查询中的 <time1><time2>

    #legacySQL
    SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@time1-time2]