如何在另一个大查询计划查询运行后立即运行大查询计划查询

问题描述

我在通过另一个计划大查询作业触发计划大查询作业时遇到问题。 我有 2 个大查询表,一旦文件被放入谷歌云存储桶,它们就会被加载。我有 2 个数据流作业,它触发进程并加载大查询表。使用云函数和发布子主题,我触发了这两个表的调度查询。我很容易为数据流作业创建过滤器,这将触发我的计划查询。例如如下

protoPayload.methodName="jobservice.jobcompleted"
protoPayload.serviceData.jobCompletedEvent.job.jobStatus.state="DONE"
protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.load.destinationTable.tableId="table_name"
protoPayload.serviceData.jobCompletedEvent.job.referencedTables.datasetId="big query dataset name"
protoPayload.serviceData.jobCompletedEvent.job.referencedTables.projectId="my project id"

这很好用,并且触发了计划查询。我对其他表也有类似的检查。

现在,我面临的问题是,一旦我之前的计划查询运行良好,我需要触发另一个计划查询,这是挑战。 我唯一能想到的并且可以根据下面过滤日志

    protoPayload.methodName="jobservice.jobcompleted"
    protoPayload.serviceData.jobCompletedEvent.job.jobStatus.state="DONE"
  protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.labels.data_source_id="scheduled_query"

但是,上面为我提供了在我的项目中运行的所有计划查询的日志,其中我正在寻找特定的查询。我之前运行的调度查询有很多插入语句和很少的更新语句,因此表 id 在那里为零。唯一独特的是每个调度查询日志中存在的查询, 您认为我是否需要添加作为我的计划查询的一部分运行的多个查询中的最后一个查询来过滤日志并表示计划查询已完成?例如下面

protoPayload.methodName="jobservice.jobcompleted"
protoPayload.serviceData.jobCompletedEvent.job.jobStatus.state="DONE"
protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.labels.data_source_id="scheduled_query"
protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.query.query="UPDATE `whr-asia-datalake-nonprod.WHR_DATALAKE.CONSUMER_EXTRACT` CEXT SET CEXT.CUST_MOBILE=If ( length(SAFE_CAST(CEXT.CUST_MOBILE AS STRING))=10,SAFE_CAST(CONCAT('91',CEXT.CUST_MOBILE) AS Numeric),CEXT.CUST_MOBILE) WHERE TRUE"

然而,上面没有给出任何日志。 请告知,因为我被卡住了,需要在产品中部署它。

解决方法

您可以使用计划查询发布订阅通知功能来获取执行过程的更新。在 Cloud Functions 中,接收和处理 PubSub 消息并检查状态值,完成后,像第一次一样触发您的计划查询。

enter image description here