作者:小妖694_807 | 来源:互联网 | 2022-12-01 13:37
当我继续向BigQuery追加行时,我希望为每个id提供最新行的"物化视图".
我怎样才能做到这一点?
1> Felipe Hoffa..:
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
)
现在我想用自该日期以来收到的所有新行更新它:
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 Scheduled Queries,它将使用当前时间戳替换@run_time.
要创建将此方法与最新记录的实时视图相结合的视图,请参阅:
我想要"实时物化视图",以及任何行的最新信息
您可以使用[预定查询](https://cloud.google.com/bigquery/docs/scheduling-queries)功能(目前处于测试阶段)进行排程,对吧?