Dataflow 2.x在调用PCollectionTuple.apply()时抱怨参数类型不正确

时间:2017-12-27 22:44:00

标签: java apache-beam dataflow

我将现有管道迁移到数据流2.x.在管道的最后阶段,数据将写入Google云服务。数据需要压缩到.gz,所以之前(在我们的数据流1.x实现中)我们编写了自己的Sink来为我们做这件事。在dataflow 2.x中,有一种内置方法可以做到这一点。我有什么应该是正确的代码,但java编译器抱怨TextIO.write()返回一个不正确的类型。代码如下:

PCollectionTuple results = /* some transforms */

// write main result
results.get(mainOutputTag).
apply("WriteProfile", TextIO.write().to(outputBucket)
.withSuffix(".json")        
.withWritableByteChannelFactory(FileBasedSink.CompressionType.GZIP)
.withNumShards(numChunks));

Java的编译器抱怨,出现此错误:

The method apply(String, PTransform<? super PCollection<TableRow>,OutputT>) in the type PCollection<TableRow> is not applicable for the arguments (String, TextIO.Write)

有人看到我上面的代码可能出现什么问题?如果您需要更多背景信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

我最终解决了这个问题。问题是我正在尝试将PCollection<TableRow>写入文件,其中只能将PCollection<String>写入文件。

这是我的最终解决方案:

PCollectionTuple results = /* some transforms */

// write main result
results.get(mainOutputTag) /* PCollection<TableRow> */

    .apply(ParDo.of(new DoFn<TableRow, String>() {
        @ProcessElement
        public void processElement(ProcessContext c) {
            c.output(c.element().toString());
        }
    })) /* PCollection<String> */

    .apply("WriteProfile", TextIO.write().to(outputBucket)
    .withSuffix(".json")        
    .withWritableByteChannelFactory(FileBasedSink.CompressionType.GZIP)
    .withNumShards(numChunks));