从 Bigquery 中的原始表主动创建洞察表

Posted

技术标签:

【中文标题】从 Bigquery 中的原始表主动创建洞察表【英文标题】:Actively create Insights Table from Raw table in Bigquery 【发布时间】:2021-07-08 17:14:12 【问题描述】:

我在 Bigquery 中有一个原始表,可以从本地表中提取流数据。数据可以是 3 种类型的插入、更新或删除,因此为了克服执行 DML 操作,我创建了带有附加 creation_timestamp 和操作(I,U,D) 的模式,并以流方式插入到 Bigquery 表中。

现在,我想在这个原始表之上创建一个洞察表,我基本上可以使用下面的查询来获得它,以便我可以在需要时提取数据,因为创建视图无济于事。

 select * except(rn, creation_timestamp, operation ) from(select *, row_number() over(partition by <primary_key> order by creation_timestamp desc, operation desc ) rn
    from  <Table_name> )
    where rn =1 and operation!='D'

请提出一种方法,以便我可以让数据流入 Insights 表中,而这些数据只有来自 Raw 表的活动记录。

【问题讨论】:

【参考方案1】:

使用存储过程解决了这个问题。

我首先使用以下查询创建一个存储过程

并安排它使用云功能和云计划每五分钟运行一次。

注意:考虑到creation_timestampp 的延迟比实际数据插入时间戳的延迟,每5 分钟从原始表中获取10 分钟的窗口数据。因为,creation_timestmap 创建了另一个云函数,用于将数据存储到原始表中。

    CREATE OR REPLACE PROCEDURE
  <stored_procedure>()
BEGIN
INSERT INTO
  <insights_table>
SELECT
  *
FROM
  <raw_table>
WHERE
  creation_timestamp>current_timesamp-10mins;
DELETE
  <insights_table> outside
WHERE
  NOT EXISTS(
  SELECT
    *
  FROM (
    SELECT
      * EXCEPT(rn )
    FROM (
      SELECT
        *,
        ROW_NUMBER() OVER(PARTITION BY <primary_key> ORDER BY creation_timestamp DESC, operation DESC ) rn
      FROM
        <insights_table> )
    WHERE
      rn =1
      AND operation!='D') inside
  WHERE
    outside.<primary_key>=inside.<primary_key>
    AND outside.creation_timestamp=inside.creation_timestamp
    AND outside.operation=inside.operation );
END
  ;

如果有的话,请提出任何更好的方法或对当前方法的改进。

【讨论】:

以上是关于从 Bigquery 中的原始表主动创建洞察表的主要内容,如果未能解决你的问题,请参考以下文章

我无法将数据从 BigQuery 迁移到数据洞察

如何使用 UI 从 BigQuery 中的视图创建表?

从 BigQuery 中的 .avro 文件创建表时出现“resourcesExceeded”错误

从 Bigquery 中的查询复制表

仅当查询不为空时,才从查询写入 BigQuery 中的表

在从日志条目创建的会话表中查找并发用户