【问题标题】:BigQuery querying _TABLE_SUFFIX in views with wildcard tablesBigQuery 在带有通配符表的视图中查询 _TABLE_SUFFIX
【发布时间】:2020-11-26 10:24:22
【问题描述】:

问题总结:

如何使用_TABLE_SUFFIX 作为过滤器而不是列(将查询所有表)查询基于通配符表的视图?

例如

 SELECT Name, date, weight 
 FROM `my_view`
 WHERE _TABLE_SUFFIX >= '2020-01-01'

而不是

 SELECT Name, date, weight 
 FROM `my_view`
 WHERE date >= '2020-01-01'

详细问题:

假设我有一张表格bq.school.weights_20191231,格式如下

| Name  | Date       | Weight |
|-------|------------|--------|
| Bob   | 2019-12-31 | 55kg   |
| Alex  | 2019-12-31 | 95kg   |
| ...   | ...        | ..     |
| Sandy | 2019-12-31 | 43kg   |

还有一张桌子bq.school.weights_20200101

| Name  | Date       | Weight |
|-------|------------|--------|
| Bob   | 2020-01-01 | 60kg   |
| Alex  | 2020-01-01 | 100kg  |
| ...   | ...        | ..     |
| Sandy | 2020-01-01 | 40kg   |

我基于基表 bq.school.weights_* 创建了一个名为 weights_view 的视图,例如

SELECT Name, Date, Weight 
FROM `bq.school.weights_*`

如何使用_TABLE_SUFFIX 查询weights_view 来过滤日期,而不是使用WHERE DATE = "2020-01-01"(会查询所有表)?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    除了@AH 的回答之外,您还可以在 WHERE 语句中简单地引用 _TABLE_SUFFIX 而无需选择它并查询视图。

    我必须指出,根据documentation,_TABLE_SUFFIX 伪列包含与表通配符匹配的值。此外,它不需要在 SELECT 子句中。下面是一个使用公共数据集的例子,它扫描两个表gsod1940gsod1944

    #standardSQL
    SELECT
      max,
      ROUND((max-32)*5/9,1) celsius,
      mo,
      da,
      year
    FROM
      `bigquery-public-data.noaa_gsod.gsod*`
    WHERE
      ( _TABLE_SUFFIX = '1940'
        OR _TABLE_SUFFIX = '1944' )
    ORDER BY
      max DESC
    

    请注意,表的名称中有一个模式noaa_gsod.gsod,后面跟着一个年份。另外,请注意伪列 _TABLE_SUFFIX 没有被选中。虽然您可以根据需要进行选择。

    最后,我必须强调,在 _TABLE_SUFFIXhere:

    中使用通配符是有限制的
    • 通配符表功能不支持视图。如果通配符表匹配数据集中的任何视图,则查询返回 错误。无论您的查询是否包含 WHERE 子句,这都是正确的 在 _TABLE_SUFFIX 伪列上过滤掉视图。

    • 目前,使用通配符对多个表的查询不支持缓存结果,即使“使用缓存结果”选项也是如此 被检查。如果您多次运行相同的通配符查询,您将 为每个查询计费。通配符表支持原生 BigQuery 存储 只要。查询外部表或表时不能使用通配符 查看。

    • 包含数据操作语言 (DML) 语句的查询不能使用通配符表作为查询目标。例如,一个 通配符表可以用在 UPDATE 查询的 FROM 子句中,但是 不能将通配符表用作 UPDATE 操作的目标。

    • 受客户管理的加密密钥 (CMEK) 保护的表不支持通配符查询。

    【讨论】:

      【解决方案2】:

      解决方案

      类似于BigQuery Date-Partitioned Views 的问题,你需要暴露_TABLE_SUFFIX 列,然后查询掉它,例如

      SELECT Name, Weight, _TABLE_SUFFIX AS the_date
      FROM `bq.school.weights_*
      

      然后用

      查询视图
      SELECT *
      FROM `weights_view`
      WHERE the_date = "20200101"
      

      【讨论】:

        【解决方案3】:

        可以直接在where子句中做

        选择名称、重量 FROM bq.school.weights_* WHERE _table_suffix >= "20200101"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-25
          • 1970-01-01
          相关资源
          最近更新 更多