BigQuery - 在插入表时调用查询

Posted

技术标签:

【中文标题】BigQuery - 在插入表时调用查询【英文标题】:BigQuery - invoke query upon insert to a table 【发布时间】:2021-02-16 13:39:46 【问题描述】:

这是我的用例。

一个新的 CSV 文件被上传到 GCS 存储桶中,接下来数据被插入到 BigQuery 表中,在数据进入 BigQuery 之后,应该在插入事件时触发后处理查询。

为了实现第一步,我在 Python 中创建了一个云函数,将数据从 GCS 存储桶加载到 BigQuery 表。

我正在为第二步苦苦挣扎,因为 BigQuery 不支持数据库触发器的概念。

现在我正在使用不理想的计划查询,因为即使基础表没有更改,它也会运行。

由于涉及成本,我不愿意使用 Composer,我正在寻找一种简单且经济高效的解决方案。

【问题讨论】:

【参考方案1】:

可以有多种方法来实现这一点。两个简单的可以是:

    您可以使用从 GCS->BQ 加载数据的相同云函数在加载完成时运行附加查询。

    从您的云功能中,您可以在某种类型的队列(Pub/Sub、Redis、RabbitMQ 等)中设置一个唯一标识符,该标识符由您的一个进程以离散的时间间隔轮询,并且在看到任何新条目时,它可以运行后处理查询。这样,第二个进程就不会盲目地触发 BQ 查询,并且总是在看到队列中有新条目时运行。您可以阅读如何发布 Pub/Sub 消息 here。您的其他进程可以是 cron 作业,也可以只是另一个云功能,您可以随时按需触发。

    另一个选项(更原始的选项)可能是在完成将数据加载到 BQ 后,将一个微小的 JSON 文件发送到某个 GCS 存储桶文件夹,其中包含 "status": True 之类的内容。然后绑定另一个云函数,以在将新文件放入该 GCS 存储桶文件夹时立即触发后处理 BQ 查询。

【讨论】:

感谢您的建议,您能否详细说明使用 Pub/Sub 的第二种方式。 我添加了一些细节。 最终我按照你的第一个建议将代码附加到现有的云函数中,结果正是我想要的。【参考方案2】:

作为附加选项考虑:

您的云功能在加载数据后,可以向 PubSub 主题发送一些消息(可能需要一些相关的详细信息)(这将需要几毫秒) - 您修改您的云功能就是这样,并创建一个 PubSub为此目的的主题。

在这个话题的另一边,还有一个云功能,它是自动触发的。您可以开发该云功能并实现您需要的任何功能。

【讨论】:

以上是关于BigQuery - 在插入表时调用查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将查询结果插入 BigQuery 前缀表

将 MySQL 查询转换为 BigQuery 查询

BigQuery:无效日期错误

查询结果后 BigQuery 导出多个文件

如何在 BigQuery 中安排脚本?

在 BigQuery 中恢复过期的 Firebase 表并将数据保存时间超过 60 天