如何将Pcollection <string>变量转换为String

时间:2018-03-06 12:31:55

标签: google-bigquery google-cloud-storage google-cloud-dataflow

我有类型为String的PCollection&lt; String&gt; ,我想将其转换为从BigQuery表中获取特定列的值。所以我使用 BigQueryIO.readTableRows 从BigQuery获取值。

这是我的代码:

     PCollection<TableRow> getConfigTable = pipeline.apply("read from Table",
            BigQueryIO.readTableRows().from("TableName"));

    RetrieveDestTableName retrieveDestTableName = new RetrieveDestTableName();
    PCollection<String> getDestTableName = getConfigTable.apply(ParDo.of(new DoFn<String,String>(){
        @ProcessElement
        public void processElement(ProcessContext c){
            c.output(c.element().get("ColoumnName").toString());
        }
    }));

根据上面的代码,我将从PCollection&lt; String&gt;类型的 getDestTableName 获得输出。但我想在 String 变量中输出此输出。

有没有办法将 PCollection&lt; String&gt; 转换为 String 数据类型变量,以便我能够在我的代码中使用变量?

2 个答案:

答案 0 :(得分:1)

Apache Beam编程模型中无法将PCollection<String>转换为StringPCollection只是描述任何给定点的管道状态。在开发过程中,您无法对PCollection中的字符串进行文字访问。

您可以通过转换处理PCollection中的字符串。但是,您似乎需要表配置来构建管道的其余部分。您需要提前知道目标,或者可以使用DynamicDestinations来确定在管道执行期间要写入哪个表。您无法从PCollection获取表配置值,并使用它来进一步构建管道。

答案 1 :(得分:0)

似乎你需要像JdbcIO.readAll()这样的东西,但对于BigQuery,允许管道动态计算读取配置。目前没有为BigQuery实现这一点,但它是一个合理的请求。

同时你的选择是:

  • 表达您作为更复杂的BigQuery SQL查询所做的事情,并使用单个BigQueryIO.read().fromQuery()
  • 使用Beam API快速提取感兴趣的表所在的管道部分,而不是直接使用BigQuery API,因此您正在操作常规Java变量而不是PCollection s。