我试图弄清楚如何为自定义实现交换Coder(StringUtf8Coder)。
我已经实现了一个编码器,它增加了处理snappy压缩字符串的能力:
import com.google.cloud.dataflow.sdk.coders.ByteArrayCoder;
import com.google.cloud.dataflow.sdk.coders.Coder;
import com.google.cloud.dataflow.sdk.coders.CoderException;
import com.google.cloud.dataflow.sdk.coders.DelegateCoder;
import com.google.common.base.Charsets;
import org.xerial.snappy.Snappy;
import java.io.IOException;
public class CompressedByteArrayCoder extends DelegateCoder<String, byte[]> {
private static String decompressSnappy(byte[] input) throws IOException {
if (input == null) {
throw new CoderException("null input is not accepted");
}
if (Snappy.isValidCompressedBuffer(input)) {
return Snappy.uncompressString(input);
}
return new String(input, Charsets.UTF_8);
}
private static byte[] compressSnappy(String input) throws IOException {
return Snappy.compress(input);
}
public static CompressedByteArrayCoder of() {
return new CompressedByteArrayCoder(ByteArrayCoder.of(), CompressedByteArrayCoder::compressSnappy, CompressedByteArrayCoder::decompressSnappy);
}
private CompressedByteArrayCoder(Coder<byte[]> coder, CodingFunction<String, byte[]> toFn, CodingFunction<byte[], String> fromFn) {
super(coder, toFn, fromFn);
}
}
我试图找出一种方法来交换StringUtf8Coder(PubSubIO.Read的默认值),其方式不会导致数据流管道更新失败。
我试图弄清楚如何告诉数据流服务运行者这两个编码器是&#34;兼容&#34;。
答案 0 :(得分:1)
不幸的是,此时更新Google Cloud Dataflow服务上正在运行的管道时,无法更改PCollection的编码器。在这种情况下,您必须将管道提交为新的Dataflow作业。
有关详细信息,请参阅Updating an Existing Pipeline,特别是有关兼容性检查的部分。
然而,这是我们将来可能会解决的问题。请查看我们的文档以获取更新。