Google bigquery 执行BigQueryIO.write()时获取/设置BigQuery作业ID

Google bigquery 执行BigQueryIO.write()时获取/设置BigQuery作业ID,google-bigquery,google-cloud-dataflow,apache-beam,Google Bigquery,Google Cloud Dataflow,Apache Beam,是否可以在批处理管道运行时设置或获取BigQuery作业ID。 我知道使用BigQueryAPI是可能的,但如果我使用ApacheBeam的BigQueryIO,这可能吗? 在写入BigQuery后,我需要发送一个确认,确认加载已完成。目前这是不可能的。一个BigQueryIO.write()可能会在后台使用许多BigQuery作业(即BigQueryIO.write()是一个用于将数据写入BigQuery的通用API,而不是一个用于处理单个特定BigQuery加载作业的API),这一事实使问题

是否可以在批处理管道运行时设置或获取BigQuery作业ID。
我知道使用BigQueryAPI是可能的,但如果我使用ApacheBeam的BigQueryIO,这可能吗?
在写入BigQuery后,我需要发送一个确认,确认加载已完成。

目前这是不可能的。一个
BigQueryIO.write()
可能会在后台使用许多BigQuery作业(即
BigQueryIO.write()
是一个用于将数据写入BigQuery的通用API,而不是一个用于处理单个特定BigQuery加载作业的API),这一事实使问题变得复杂,例如:

  • 如果要加载的数据量大于单个加载作业的BigQuery限制,
    BigQueryIO.write()
    将其分为多个加载作业
  • 如果您使用的是目标相关的写入方法之一(例如,
    DynamicDestinations
    ),并且同时加载到多个表中,则每个表至少有一个加载作业
  • 如果您使用
    BATCH_LOADS
    方法编写一个无限制的
    PCollection
    ,它将根据上述说明定期为新到达的数据发出加载作业
  • 如果您使用的是
    STREAMING\u INSERTS
    方法(即使您正在编写一个有界
    PCollection
    ,也允许使用该方法),那么将不会有任何加载作业

您需要使用一种典型的变通方法来“在做了其他事情之后再做某件事”,例如,在主程序中使用
pipeline.run().waitUntilFinish()
等待整个管道完成,然后执行第二个操作。

目前这是不可能的。一个
BigQueryIO.write()
可能会在后台使用许多BigQuery作业(即
BigQueryIO.write()
是一个用于将数据写入BigQuery的通用API,而不是一个用于处理单个特定BigQuery加载作业的API),这一事实使问题变得复杂,例如:

  • 如果要加载的数据量大于单个加载作业的BigQuery限制,
    BigQueryIO.write()
    将其分为多个加载作业
  • 如果您使用的是目标相关的写入方法之一(例如,
    DynamicDestinations
    ),并且同时加载到多个表中,则每个表至少有一个加载作业
  • 如果您使用
    BATCH_LOADS
    方法编写一个无限制的
    PCollection
    ,它将根据上述说明定期为新到达的数据发出加载作业
  • 如果您使用的是
    STREAMING\u INSERTS
    方法(即使您正在编写一个有界
    PCollection
    ,也允许使用该方法),那么将不会有任何加载作业

您需要使用一种典型的变通方法来解决“在做了其他事情之后再做某件事”,例如,在主程序中使用
pipeline.run().waitUntilFinish()
,等待整个管道完成,然后执行第二个操作。

非常酷的答案!只是想知道你是否能告诉我们在代码中碎片的书写发生在哪里。是
apitools
库已经处理了这个问题,还是
BigQuerySink
类?我试图在代码中找到它发生的位置,但还没找到:)@jkff好的。但是,您建议的解决方法是否适用于模板,因为根据我的理解,在pipeline.run()之后编写的任何语句。waitUntilFinish()都不会是我模板的一部分。我说得对吗?你说得对。不幸的是,目前没有很好的模板解决方案。非常酷的答案!只是想知道你是否能告诉我们在代码中碎片的书写发生在哪里。是
apitools
库已经处理了这个问题,还是
BigQuerySink
类?我试图在代码中找到它发生的位置,但还没找到:)@jkff好的。但是,您建议的解决方法是否适用于模板,因为根据我的理解,在pipeline.run()之后编写的任何语句。waitUntilFinish()都不会是我模板的一部分。我说得对吗?你说得对。不幸的是,目前没有很好的模板解决方案。