【发布时间】:2017-02-05 15:02:00
【问题描述】:
我正在尝试从按日期分区的 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')
'YYYY-MM-DD' 是一个特定的日期确实有效。
但是,我以后需要运行这个脚本,但是表更新(和_PARTITIONTIME)是不规则的。有没有办法只从 BigQuery 的最新分区中提取数据?
【问题讨论】:
-
你能澄清一下 - 它是如何不起作用的吗?它有什么问题?
-
我在下面评论过,但是这两个查询都不是从最新的分区中读取的。当我明确键入最后一个 _partitiontime 时,查询读取 18 MB。但是,当我尝试以下两个查询中的任何一个时,它们显示为 15.4 GB。
-
我现在明白了。谢谢你的更新!有趣的是理解为什么。 @felipe-hoffa 提到了一些关于缓存的事情——但这并不清楚
-
是的。这样它就可以工作,但有趣的是为什么它不能内联工作 - 在一个查询中
-
我想我现在明白了。很明显,但这是我的猜测......所以当使用 value 时 - 涉及分区 get 并且 bq 引擎知道要扫描什么,不扫描什么;但是当使用表达式时 - 它的工作方式完全不同 - 分区本身并没有真正起作用(我认为这就是 Felipe 所说的缓存)所以在这种情况下查询被视为连接,因此整个表被扫描并连接到表达式的结果。仍然可以通过编写该逻辑脚本来轻松解决 - 正如您所提到的 - 首先获取子查询的结果,然后在最终查询中使用它
标签: google-bigquery