我想要最新记录的“物化视图”

时间:2018-10-25 16:18:44

标签: google-bigquery

随着我不断向BigQuery追加行,我希望每个ID都有最新行的“物化视图”。

我该怎么做?

1 个答案:

答案 0 :(得分:7)

2018-10:BigQuery不支持materialized views,但是您可以使用这种方法:

假设您想要一个具有每行最新信息的表,并且希望对其进行更新-这样任何查询的人都可以轻松访问最新行而不必扫描整个仅附录表。

在此示例中,我将使用Wikipedia clustered logs-并创建一个表格,其中包含所有以'A'开头的英语页面的最新行。这些限制使出于此演示目的,我的查询变得越来越小。

让我们首先创建表:

CREATE TABLE `wikipedia_vt.just_latest_rows` AS
SELECT latest_row.* 
FROM (
  SELECT ARRAY_AGG(a ORDER BY datehour DESC LIMIT 1)[OFFSET(0)] latest_row
  FROM `fh-bigquery.wikipedia_v3.pageviews_2018` a
  WHERE datehour BETWEEN "2018-10-18" AND "2018-10-21" 
  AND wiki='en' AND title LIKE 'A%'
  GROUP BY title
)

现在我想用自该日期以来收到的所有新行进行更新:

MERGE `wikipedia_vt.just_latest_rows` T
# our "materialized view"
USING  (
  SELECT latest_row.* 
  FROM (
    SELECT ARRAY_AGG(a ORDER BY datehour DESC LIMIT 1)[OFFSET(0)] latest_row
    FROM `fh-bigquery.wikipedia_v3.pageviews_2018` a
    WHERE datehour > TIMESTAMP_SUB(@run_time, INTERVAL 1 DAY )
    # change to CURRENT_TIMESTAMP() or let scheduled queries do it
    AND datehour > '2000-01-01' # nag
    AND wiki='en' AND title LIKE 'A%'
    GROUP BY title
  )
) S
ON T.title = S.title

WHEN MATCHED THEN
  # if the row is there, we update the views and time
  UPDATE SET views = S.views, datehour=S.datehour

WHEN NOT MATCHED BY TARGET THEN
  # if the row is not there, we insert it 
  INSERT (datehour, wiki, title, views) VALUES (datehour, wiki, title, views)

现在,您应该设置一个过程以定期运行此查询。为了降低查询成本,请确保该过程更改了更新的开始日期。

设置此过程的一种简单方法是使用新的BigQuery计划查询,该查询将使用当前时间戳替换@run_time。

要创建将这种方法与最新记录的实时视图结合起来的视图,请参见:

enter image description here