【问题标题】:BigQuery filter per the last Date and use PartitionBigQuery 按最后一个日期过滤并使用分区
【发布时间】:2019-09-09 22:59:48
【问题描述】:

我问如何过滤最后一个日期,得到了很好的答案(BigQuery, how to use alias in where clause?),它们都可以,但是,它们扫描整个表,字段 SETTLEMENTDATE 是一个分区字段,有没有办法只扫描一个分区

作为一个例子,我正在使用这个查询

#standardSQL
SELECT * EXCEPT(isLastDate) 
FROM (
  SELECT *, DATE(SETTLEMENTDATE) = MAX(DATE(SETTLEMENTDATE)) OVER() isLastDate
  FROM `biengine-252003.aemo2.daily`
)
WHERE isLastDate 

编辑:请最后日期并不总是当前日期,因为数据存在滞后

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    现在 scripting is in beta 在 BigQuery 中,您可以声明一个包含目标日期的变量。这是一个例子:

    SET max_date DATE DEFAULT (SELECT DATE(MAX(datehour)) FROM `fh-bigquery.wikipedia_v3.pageviews_2019` WHERE wiki='es');
    
    SELECT MAX(views)
    FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
    WHERE DATE(datehour) = max_date
    AND wiki='es'
    

    【讨论】:

      【解决方案2】:

      假设 SETTLEMENTDATE 是 DATE 数据类型,你可以使用下面来获取今天的分区

      SELECT *
      FROM `biengine-252003.aemo2.daily`
      WHERE SETTLEMENTDATE = CURRENT_DATE()     
      

      或者,例如昨天的分区

      SELECT *
      FROM `biengine-252003.aemo2.daily`
      WHERE SETTLEMENTDATE = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)     
      

      https://cloud.google.com/bigquery/docs/querying-partitioned-tables#querying_partitioned_tables_2查看更多信息

      【讨论】:

      • 谢谢,我的数据有延迟,有时会延迟 2 天,这意味着最大日期并不总是当前日期
      • 可能的最大延迟是多少? 2天?,3天?
      • 随机,从今天到4天
      • 我正在考虑首先基于WHERE SETTLEMENTDATE BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 4 DAY) AND DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) 进行选择,然后在外部查询中基于该子查询结果中的最大日期进行选择。所以你将最多查询 4 ​​个分区而不是整个表
      【解决方案3】:

      米哈伊尔的回答看起来像这样(处理公共数据):

      SELECT MAX(views)
      FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
      WHERE DATE(datehour) = DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)     
      AND wiki='es' 
      # 122.2 MB processed
      

      但问题似乎是这样的:

      SELECT MAX(views)
      FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
      WHERE DATE(datehour) = (SELECT DATE(MAX(datehour)) FROM `fh-bigquery.wikipedia_v3.pageviews_2019` WHERE wiki='es')     
      AND wiki='es'
      # 50.6 GB processed
      

      ...但小于 50.6GB

      您现在需要的是某种脚本,分两步执行:

      max_date = (SELECT DATE(MAX(datehour)) FROM `fh-bigquery.wikipedia_v3.pageviews_2019` WHERE wiki='es')   
      
      ;
      
      SELECT MAX(views)
      FROM `fh-bigquery.wikipedia_v3.pageviews_2019` 
      WHERE DATE(datehour) = {{max_date}}
      AND wiki='es'
      # 115.2 MB processed
      

      您必须在 BigQuery 之外编写此脚本 - 或在 https://issuetracker.google.com/issues/36955074 上等待消息。

      【讨论】:

        猜你喜欢
        • 2018-11-07
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多