当我不断向 BigQuery 添加行时,我希望为每个 ID 的最新行创建一个“物化 View ”。
我怎样才能做到这一点?
最佳答案
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。
要创建将此方法与最新记录的实时 View 相结合的 View ,请参阅:
关于google-bigquery - 我想要最新记录的 "materialized view",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52993916/