Java 在谷歌云数据流中使用TextIO.Write和复杂的PCollection类型

Java 在谷歌云数据流中使用TextIO.Write和复杂的PCollection类型,java,google-cloud-dataflow,Java,Google Cloud Dataflow,我有一个PCollection,看起来像这样: PCollection<KV<KV<String, EventSession>, Long>> windowed_counts 但是我很难正确设置编码器。这就是我认为有效的方法: KvCoder kvcoder = KvCoder.of(KvCoder.of(StringUtf8Coder.of(), AvroDeterministicCoder.of(EventSession.class) ), Te

我有一个PCollection,看起来像这样:

PCollection<KV<KV<String, EventSession>, Long>> windowed_counts
但是我很难正确设置编码器。这就是我认为有效的方法:

    KvCoder kvcoder = KvCoder.of(KvCoder.of(StringUtf8Coder.of(), AvroDeterministicCoder.of(EventSession.class) ), TextualLongCoder.of());
    TextIO.Write.Bound io = TextIO.Write.withCoder( kvcoder );
    windowed_counts.apply( io.to( "output" ));
其中TextualLongCoder是我自己的原子编码器的子类,类似于TextualIntegerCoder。EventSession类被注释为使用AvroDeterministicCoder作为其默认编码器


但有了这个,我得到了乱码输出,包括非文本字符,等等。有人能建议你如何将这个特殊的PCollection写成文本吗?我确信我在这里遗漏了一些明显的东西…

您是否尝试创建一个转换,将KV的PCollection转换为字符串的PCollection,然后将其写入文本文件


我发现这是满足我需求的最灵活的方式

您是否尝试创建一种转换,将KV的PCollection转换为字符串的PCollection,然后将其写入文本文件


我发现它是满足我需求的最灵活的方式

您希望使用哪种输出格式?例如,你想要一个逗号分隔的文件吗?那部分对我来说甚至都不是那么重要。。。如果是空格分隔的,或者是逗号分隔的,随便什么。我现在正在努力弄清楚如何以任何文本格式写出它。而且我发现您没有使用泛型,所以可能是因为参数中存在隐藏的不匹配导致的。您希望使用哪种输出格式?例如,你想要一个逗号分隔的文件吗?那部分对我来说甚至都不是那么重要。。。如果是空格分隔的,或者是逗号分隔的,随便什么。我现在正努力想知道如何以任何文本格式写出它。而且我发现您没有使用泛型,所以可能是因为参数中存在隐藏的不匹配导致的?不,但如果我找不到更直接的方法,这是我的计划。作为GB notes,这是解决此问题的正确方法。不,但如果我找不到更直接的方法,那就是我的计划。正如GB所指出的,这是解决这个问题的正确方法。
    KvCoder kvcoder = KvCoder.of(KvCoder.of(StringUtf8Coder.of(), AvroDeterministicCoder.of(EventSession.class) ), TextualLongCoder.of());
    TextIO.Write.Bound io = TextIO.Write.withCoder( kvcoder );
    windowed_counts.apply( io.to( "output" ));