Google cloud dataflow 如何在Dataflow Java SDK中压缩输出文件?

Google cloud dataflow 如何在Dataflow Java SDK中压缩输出文件?,google-cloud-dataflow,Google Cloud Dataflow,我的管道将输出数据文件存储到GCS。 我想压缩这个文件。 TextIO已解压压缩的文件, 但我猜它没有压缩文件。 如何压缩输出文件?TextIO仅支持读取压缩文件。它不支持使用压缩写入文件 TextIO当前不支持写入压缩文件 更多信息: 目前,这是一个开放的数据流,但这项工作已经在Beam中完成。一旦Dataflow 2.0发布(将基于Beam),这应该得到官方支持 也就是说,通过扩展类并利用Jeff Payne在Beam中关于此功能的工作,我已经能够编写压缩的GZIP文件 public

我的管道将输出数据文件存储到GCS。 我想压缩这个文件。 TextIO已解压压缩的文件, 但我猜它没有压缩文件。
如何压缩输出文件?

TextIO
仅支持读取压缩文件。它不支持使用压缩写入文件

TextIO当前不支持写入压缩文件

更多信息:

目前,这是一个开放的数据流,但这项工作已经在Beam中完成。一旦Dataflow 2.0发布(将基于Beam),这应该得到官方支持

也就是说,通过扩展类并利用Jeff Payne在Beam中关于此功能的工作,我已经能够编写压缩的GZIP文件

public类GZIPSink扩展了FileBasedSink{
私人最终编码器;
GZIPSink(字符串baseOutputFilename,Coder-Coder){
超级(baseOutputFilename,“.gz”);
this.coder=编码器;
}
@凌驾
public FileBasedWriteOperation createWriteOperation(管道选项管道选项){
返回新的GZIPWriteOperation(此为编码器);
}
静态类GZIPWriteOperation扩展了FileBasedSink.FileBasedWriteOperation{
私人最终编码器;
专用GZIPWriteOperation(GZIPSink接收器、编码器){
超级(水槽);
this.coder=编码器;
}
@凌驾
公共FileBasedWriter createWriter(PipelineOptions PipelineOptions)引发异常{
返回新的GZIPBasedWriter(这个,编码器);
}
}
静态类GZIPBasedWriter扩展了FileBasedSink.FileBasedWriter{
私有静态最终字节[]换行=“\n”.getBytes(StandardCharsets.UTF_8);
私人最终编码器;
私人GZIPOutputStream out;
公共GZIPBasedWriter(FileBasedWriteOperation写入操作,编码器){
超级(写操作);
this.mimeType=MimeTypes.BINARY;
this.coder=编码器;
}
@凌驾
受保护的void prepareWrite(可写ByTechannel通道)引发异常{
out=new GZIPOutputStream(Channels.newOutputStream(channel),true){{
def.setLevel(def.BEST_压缩);
}};
}
@凌驾
public void write(T值)引发异常{
coder.encode(值,out,coder.Context.OUTER);
out.write(换行符);
}
@凌驾
public void writeFooter()引发IOException{
out.finish();
}
}
}     
然后实际写下:


aStringPCollection.apply(Write.to(新的GZIPSink(“gs://path/sharded filename”,StringUtf8Coder.of());
正如Thang所提到的,现在可以在beam sdk版本2中添加
。with Compression(Compression.GZIP)


给出的完整示例可以在PR链接中找到,PR合并到Beam中,因为在我的业力级别,每个帖子只能有2个链接。
// Without Compression:
pcollection.apply(TextIO.write().to("/path/to/file.txt"));

// With Compression:
pcollection.apply(TextIO.write().to("/path/to/file.txt"))
      .withSuffix(".txt")
      .withCompression(Compression.GZIP));