如何选择BigQuery表中最新的分区?

2024-01-15

我尝试从日期分区 BigQuery 表中的最新分区中选择数据,但查询仍然从整个表中读取数据。

我已经尝试过(据我所知,BigQuery不支持QUALIFY):

SELECT col FROM table WHERE _PARTITIONTIME = (
  SELECT pt FROM (
    SELECT pt, RANK() OVER(ORDER by pt DESC) as rnk FROM (
      SELECT _PARTITIONTIME AS pt FROM table GROUP BY 1)
    )
  )
  WHERE rnk = 1
);

但这不起作用并读取所有行。

SELECT col from table WHERE _PARTITIONTIME = TIMESTAMP('YYYY-MM-DD')

where 'YYYY-MM-DD'是一个特定的日期确实有效。

但是,我需要在将来运行这个脚本,但是表更新(并且_PARTITIONTIME) 是不规则的。有没有办法只从 BigQuery 中的最新分区提取数据?


2019 年 10 月更新

支持脚本编写 https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting and 存储过程 https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_procedure目前处于测试阶段(截至 2019 年 10 月)

您可以提交用分号分隔的多个语句,BigQuery 现在可以运行它们

请参阅下面的示例

DECLARE max_date TIMESTAMP;
SET max_date = (
  SELECT MAX(_PARTITIONTIME) FROM project.dataset.partitioned_table`);

SELECT * FROM `project.dataset.partitioned_table`
WHERE _PARTITIONTIME = max_date;

对于那些喜欢在不检查上下文等情况下投票的人进行更新。

我认为,这个答案被接受是因为它解决了OP的主要问题Is there a way I can pull data only from the latest partition in BigQuery?并且在评论中提到,很明显,BQ 引擎仍然扫描所有行,但仅基于最近的分区返回结果。正如问题评论中已经提到的那样 -Still something that easily to be addressed by having that logic scripted - first getting result of subquery and then use it in final query

Try

SELECT * FROM [dataset.partitioned_table]
WHERE _PARTITIONTIME IN (
  SELECT MAX(TIMESTAMP(partition_id))
  FROM [dataset.partitioned_table$__PARTITIONS_SUMMARY__]
)  

or

SELECT * FROM [dataset.partitioned_table]
WHERE _PARTITIONTIME IN (
  SELECT MAX(_PARTITIONTIME) 
  FROM [dataset.partitioned_table]
)  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何选择BigQuery表中最新的分区? 的相关文章

随机推荐