如何使用BigQuery来使视图识别分区列

时间:2018-10-25 13:26:37

标签: google-bigquery

我有一个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

我该如何解决?

1 个答案:

答案 0 :(得分:1)

当查询达到一定复杂度时,BigQuery无法将外部查询参数传递给内部查询-因此限制了使用外部查询中的分区过滤的能力。视图也会发生这种情况。

要创建类似于“物化视图”的内容,可以使用I want a "materialized view" of the latest records中描述的方法。