我将现有管道迁移到数据流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)
有人看到我上面的代码可能出现什么问题?如果您需要更多背景信息,请与我们联系。
答案 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));