我想要一个最新记录的"物化视图"

Fel*_*ffa 5 google-bigquery

当我继续向BigQuery追加行时,我希望为每个id提供最新行的"物化视图".

我怎样才能做到这一点?

Fel*_*ffa 8

2018-10:BigQuery不支持物化视图,但您可以使用此方法:

假设您想要一个包含每行最新信息的表,并且您希望保持更新 - 因此任何查询都可以轻松访问最新行而无需扫描整个仅附加表.

对于这个例子,我将使用我的Wikipedia集群日志 - 我将创建一个表格,其中包含以"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
)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

设置此过程的一种简单方法是使用新的BigQuery Scheduled Queries,它将使用当前时间戳替换@run_time.

要创建将此方法与最新记录的实时视图相结合的视图,请参阅:

在此输入图像描述

  • 您可以使用[预定查询](https://cloud.google.com/bigquery/docs/scheduling-queries)功能(目前处于测试阶段)进行排程,对吧? (2认同)