在Apache Beam中使用BigtableIO的运行时参数

时间:2018-04-22 01:14:59

标签: java google-cloud-dataflow apache-beam google-cloud-bigtable

我试图在Apache Beam中使用BigtableIO的运行时参数来写入BigTable。

我创建了一个从BigQuery读取并写入Bigtable的管道。 当我提供静态参数时,管道工作正常(使用ConfigBigtableIO和ConfigBigtableConfiguration,这里引用示例 - https://github.com/GoogleCloudPlatform/cloud-bigtable-examples/blob/master/java/dataflow-connector-examples/src/main/java/com/google/cloud/bigtable/dataflow/example/HelloWorldWrite.java)但是在尝试使用运行时参数设置管道时遇到编译错误。 设置选项,所有参数都是运行时值提供程序。

    p.apply(BigQueryIO.readTableRows().fromQuery(options.getBqQuery())
            .usingStandardSql())
            .apply(ParDo.of(new TransFormFn(options.getColumnFamily(), options.getRowKey(), options.getColumnKey(), options.getRowKeySuffix())))

            .apply(BigtableIO.write().withProjectId(options.getBigtableProjectId()).
                    withInstanceId(options.getBigtableInstanceId()).
                   withTableId(options.getBigtableTableId()));

期望Bigtable.write()的输出为org.apache.beam.sdk.transforms.PTransform,OutputT> 而Bigtable.write()返回一个Write对象。 你能帮忙提供正确的语法来解决这个问题吗?谢谢。

1 个答案:

答案 0 :(得分:2)

运行时参数旨在用于数据流模板。

您是否尝试使用模板创建模板并运行管道?如果是,您需要执行以下步骤:

  1. 创建一个包含所需运行时参数的选项,即
    ValueProvider tableId。
  2. 将这些运行时参数传递给配置对象:即withTableId(ValueProvider tableId)=>

    withTableId(options.getTableId())
  3. 构建模板
  4. 使用模板执行管道。
  5. 使用模板的优点是它允许管道构造一次,并且稍后使用运行时参数执行多次。 有关如何使用数据流模板的更多信息:https://cloud.google.com/dataflow/docs/templates/overview

    不使用Dataflow模板时,您没有设置运行时参数,即withTableId(ValueProvider tableId)。而是使用withTableId(String tableId)。

    希望这有帮助!