使用向后兼容的编码器更改编码器以进行变换

时间:2016-03-21 01:00:44

标签: java google-cloud-dataflow

我试图弄清楚如何为自定义实现交换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;。

1 个答案:

答案 0 :(得分:1)

不幸的是,此时更新Google Cloud Dataflow服务上正在运行的管道时,无法更改PCollection的编码器。在这种情况下,您必须将管道提交为新的Dataflow作业。

有关详细信息,请参阅Updating an Existing Pipeline,特别是有关兼容性检查的部分。

然而,这是我们将来可能会解决的问题。请查看我们的文档以获取更新。