google-bigquery - 我想要最新记录的 "materialized view"

标签 google-bigquery

当我不断向 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 ,请参阅:
  • I want "live materialized views", with the latest info for any row

  • enter image description here

    关于google-bigquery - 我想要最新记录的 "materialized view",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52993916/

    相关文章:

    google-bigquery - 在滚动时间范围内计算唯一 ID

    sql - 如何尝试让 BigQuery 将 CAST BYTES 转换为 STRING?

    google-bigquery - 如何根据 BigQuery 查询触发电子邮件或其他通知?

    google-bigquery - 在 BigQuery 中使用 UNNEST 函数

    firebase - 新手 bigquery 如何从 firebase 事件中选择多个参数(模式记录,重复)

    java - 如何安全地将参数注入(inject)字符串数据库查询java?

    google-bigquery - BigQuery 不允许在 select 子句中使用 Subselect

    go - 使用 goavro 创建的 Avro 文件将数字数据加载到 BigQuery

    google-bigquery - 计划查询和集群

    node.js - 了解大查询表