Google bigquery 使用Dataflow API执行Dataprep模板时会保留流配方中包含的时间戳

Google bigquery 使用Dataflow API执行Dataprep模板时会保留流配方中包含的时间戳,google-bigquery,google-cloud-functions,google-cloud-dataflow,google-cloud-dataprep,Google Bigquery,Google Cloud Functions,Google Cloud Dataflow,Google Cloud Dataprep,我有一个云函数,它使用dataflowapi从我使用DataPrep创建的模板创建一个新作业。该配方基本上清理了一些JSON对象,将它们转换为CSV格式,并添加一个时间戳列来获取BigQuery数据库中的所有内容。主要的想法是对我们平台的某些信息进行快照 我设法从dataflow API运行作业,并且数据正确地插入到bigquery表中,但是在时间戳字段中,时间戳的值始终相同,并且它对应于我从中获取模板的作业的执行时间(DataPrep template)。当我从dataprep接口运行作业时,

我有一个云函数,它使用dataflowapi从我使用DataPrep创建的模板创建一个新作业。该配方基本上清理了一些JSON对象,将它们转换为CSV格式,并添加一个时间戳列来获取BigQuery数据库中的所有内容。主要的想法是对我们平台的某些信息进行快照

我设法从dataflow API运行作业,并且数据正确地插入到bigquery表中,但是在时间戳字段中,时间戳的值始终相同,并且它对应于我从中获取模板的作业的执行时间(DataPrep template)。当我从dataprep接口运行作业时,该时间戳被正确插入,但当我使用来自云函数的相同模板执行作业时,它不会更改

调用数据流API的代码片段:

dataflow.projects.templates.launch({
   projectId: projectId,
   location: location,
   gcsPath: jobTemplateUrl,
   resource: {
     parameters: {
       inputLocations : `{"location1" :"gs://${file.bucket}/${file.name}"}`,
       outputLocations: `{"location1" : "${location2}"}`,
       customGcsTempLocation: `gs://${destination.bucket}/${destination.tempFolder}`
     },
      environment: {
        tempLocation: `gs://${destination.bucket}/${destination.tempFolder}`,
        zone: "us-central1-f"
     },
     jobName: 'user-global-stats-flow',

   }
 }
这是Dataflow execution console快照,可以看出,最新的作业是从云函数执行的,底部的作业是从Dataprep接口执行的:

这是配方中负责创建时间戳的部分:

最后,这是在BigQuery表中插入的内容,其中具有相同时间戳的第一次插入(第4行)对应于从Dataprep执行的作业,其余的是使用Dataflow API从cloud函数执行的作业:

dataflow.projects.templates.launch({
   projectId: projectId,
   location: location,
   gcsPath: jobTemplateUrl,
   resource: {
     parameters: {
       inputLocations : `{"location1" :"gs://${file.bucket}/${file.name}"}`,
       outputLocations: `{"location1" : "${location2}"}`,
       customGcsTempLocation: `gs://${destination.bucket}/${destination.tempFolder}`
     },
      environment: {
        tempLocation: `gs://${destination.bucket}/${destination.tempFolder}`,
        zone: "us-central1-f"
     },
     jobName: 'user-global-stats-flow',

   }
 }

所以问题是是否有一种方法可以使时间戳在插入作业执行期间得到解决,因为现在它看起来像是在模板的配方中固定的


提前感谢您的帮助。

如果我理解正确,这是记录在案的行为。从以下列表中:

所有相关函数都是根据执行时刻计算的。执行云数据流模板时,不会重新计算NOW()和TODAY等函数


此时间戳是作业的参数吗?你写了模板管道吗?你能分享代码吗?我想知道您是否使用管道选项来确定时间戳,大多数管道选项在创建模板后都会备份,除非它们是使用ValueProvider编写的。这是一个理论,但我想看看模板管道代码。谢谢你的帮助。时间戳由配方使用Now函数创建。我没有创建管道,它是在数据流上运行配方时由dataprep自己创建的。所以我真的无法访问模板创建源代码。@engelramos嗨,安吉尔,你是如何导出dataprep(dataflow)作业并将其用作模板的?右键单击数据流作业并将其导出为json,将其上载到存储器并作为自定义模板运行?谢谢Hi Massimo,就在dataprep执行屏幕中,单击三点图标并单击导出结果,在那里,您可以将GCS路径复制到模板。您可以将前缀gs://添加到该路径,以便从数据流API中使用它。您可以在该线程的第一篇文章中使用该代码段。这里需要技巧的部分是使用适当的参数来调用模板,这次可以从Dataflow作业的执行屏幕(您在流程图中看到的屏幕)检查这些参数。希望它能帮助@engelramos耶!我在dataprep地面军事系统存储器中找到了它!非常感谢,这大大增强了dataprep的功能,我现在可以在google功能中添加触发器,并在正确的文件上传到GCS后立即触发数据流作业!;)