我有一个orders
表,如下:
orderid purchase_date etl_timestamp
-------------------------------------------------------------------
120 2018-10-25 13:40:48 UTC 2018-10-25 13:40:48 UTC
120 2018-10-25 13:40:48 UTC 2018-10-25 13:42:13 UTC
121 2018-10-25 13:40:48 UTC 2018-10-25 13:40:48 UTC
每个特定的时间间隔,我都使用APPEND
将数据加载到表中。因此,该表包含相同顺序的版本。
分区字段为purchase_date
。
为了处理数据,我将视图production_orders
定义为:
select
orders_id, .... purchase_date, etl_timestamp
from
(select
* ,
ROW_NUMBER() OVER (PARTITION BY orders_id order by etl_timestamp DESC) as rn
from
`PROJECT.DATASET.orders`) as t
where
t.rn = 1
这将返回每个订单的最新版本。对于上面的示例,它返回:
orderid purchase_date etl_timestamp
--------------------------------------------------------------------
120 2018-10-25 13:40:48 UTC 2018-10-25 13:42:13 UTC
121 2018-10-25 13:40:48 UTC 2018-10-25 13:40:48 UTC
这很棒,但是当我运行如下查询时:
SELECT *
FROM `PROJECT.DATASET.production_orders`
WHERE purchase_date> '2018-10-25 13:40:48 UTC'
它告诉我query will process 3.6 GB of data
。
orders
表的大小为3.6 GB-这意味着该视图不考虑分区字段。
进行比较:
SELECT *
FROM `PROJECT.DATASET.orders`
WHERE purchase_date> '2018-10-25 13:40:48 UTC'
它告诉我the query will process 945 KB data
我阅读了此BigQuery Date-Partitioned Views,但不知道如何在我的情况下使用它。我的分区是从表中选择的字段,而不是元数据字段。另外,我需要的字段是TIMESTAMP
,而不是DATE
。
我该如何解决?
答案 0 :(得分:1)
当查询达到一定复杂度时,BigQuery无法将外部查询参数传递给内部查询-因此限制了使用外部查询中的分区过滤的能力。视图也会发生这种情况。
要创建类似于“物化视图”的内容,可以使用I want a "materialized view" of the latest records中描述的方法。