从 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 中的原始表主动创建洞察表的主要内容,如果未能解决你的问题,请参考以下文章