Google bigquery BigQuery中插入过多的云函数

Google bigquery BigQuery中插入过多的云函数,google-bigquery,google-cloud-functions,Google Bigquery,Google Cloud Functions,早上好 我正在开发一个云函数,当有人将一个文件存放在一个bucket中时,该函数会将其移动到另一个bucket,在BigQuery中执行insert(从另一个表中获取信息,并从该文件中获取信息),然后从原始bucket中删除该文件 问题是,通常一次存放大约100个文件,这会导致函数失败,因为在BigQuery中进行了太多的插入,这会导致该文件中的插入未插入,并且文件未从原始存储桶中删除 该函数执行如下操作: 异步函数存档(数据、上下文){ 常量文件=数据; console.log(`Detect

早上好

我正在开发一个云函数,当有人将一个文件存放在一个bucket中时,该函数会将其移动到另一个bucket,在BigQuery中执行insert(从另一个表中获取信息,并从该文件中获取信息),然后从原始bucket中删除该文件

问题是,通常一次存放大约100个文件,这会导致函数失败,因为在BigQuery中进行了太多的插入,这会导致该文件中的插入未插入,并且文件未从原始存储桶中删除

该函数执行如下操作:

异步函数存档(数据、上下文){ 常量文件=数据; console.log(`Detected new or overwrited file'gs://${file.bucket}/${file.name}`);//'finalize'GCS触发器 const filepath=file.name.split('/'); const filename=filepath.slice(-1).join('/'); const filenameWithoutExtension=filename.split('.').slice(0,-1.join('.')) const filenameData=filenameWithoutExtension.split(''); const fileData={//example:0023\u ROMERO\u 2021\u 02.xml id_文件:filenameData[0], 名称:filenameData[1], 年份:filenameData[3], 月份:filenameData[4] }; 等待copyFile(srcBucketName、srcFilename、destBucketName等) const[job]=等待bigquery.createQueryJob({ 查询:`插入表1(……) 挑选 ... 时间戳(“${file.timeCreated}”) 从…起 表2 哪里 月份=“${file.month}” 年份=“${file.year}” 和id_file='${file.id_file}' `, 地点:'欧盟', }); log(`BigQuery作业${job.id}已启动。`); 等待作业。getQueryResults(); log(`BigQuery作业${job.id}已完成。`); 等待删除文件(file.bucket,file.name); console.log('Completed'); } 有办法解决这个问题吗


提前感谢

Bigquery有一些局限性,我们无法克服这些局限性,但您可以自定义您的应用程序来处理它

解决方案原型:-

  • 创建一个包装器脚本/代码,该脚本/代码将负责列出通过GCS-bucket登陆的所有文件
  • 在包装器代码中创建一个循环,以按顺序处理每个文件,或创建一个小型并行加载实例。这些顺序/小型并行实例将为每个文件调用您的函数

  • 您的代码似乎不完整。你能告诉我你是怎么读这个文件的吗?你做循环吗?您的数据结构是什么?为什么要执行“插入-选择”?有很多丢失的碎片!除上述问题外,部署的云功能的“最大实例数”属性是什么?如果限制是基于同时BigQuery请求的数量,则可能会限制该阈值。我确实在代码中添加了更多信息,但我认为这与此无关,因为问题在于插入的数量。我不需要读取文件,只需要从文件名中获取信息,就可以知道如何在插入之前从数据库中获取信息。@al dann以我个人的经验,在BigQuery中使用dml每10秒进行5次dml操作几乎没有意义。您是否认为在您的情况下可以接受加载或流式传输(DDL将受到该更改的影响)?同时,如果您想使用BigQuery进行“状态机”管理,它可能不是最佳选择。。。