数据流作业中同一类的不同编码器



我正在尝试为同一类使用不同的编码器,用于两种不同的场景:

  1. 从 JSON 输入文件读取 - 使用 data = TextIO.Read.from(options.getInput()).withCoder(new Coder1())
  2. 在作业的其他地方,我希望使用SerializableCoder data.setCoder(SerializableCoder.of(MyClass.class)来持久化类

它在本地工作,但在云中运行时失败

 Caused by: java.io.StreamCorruptedException: invalid stream header: 7B227365.

这是受支持的方案吗?这样做的原因首先是避免读/写JSON格式,另一方面使从输入文件中读取更有效(UTF-8解析是JSON读取器的一部分,因此可以直接从InputStream读取)

澄清:Coder1 是我的编码器。

另一个编码器是SerializableCoder.of(MyClass.class)

系统如何选择使用哪个编码器?这两种格式是二进制不兼容的,看起来由于一些优化,第二个编码器用于只能由第一个编码器读取的数据格式。

是的,使用两个不同的编码器应该可以工作。(需要注意的是,#2 中的编码器只有在系统选择持久化"数据"而不是将其优化为环绕计算时才会被使用。

您使用的是自己的编码器还是数据流 SDK 提供的编码器?关于 TextIO 的快速警告 - 因为它使用换行符来编码元素边界,如果您使用的编码器生成包含可能被误认为换行符的内容的编码值,您将遇到麻烦。您实际上应该只在 TextIO 中使用文本编码。我们希望将来能更清楚地说明这一点。

最新更新