【问题标题】:Different coders for the same class in dataflow job数据流作业中同一类的不同编码器
【发布时间】:2015-01-05 22:55:35
【问题描述】:

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

  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)

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

【问题讨论】:

    标签: google-cloud-dataflow


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      相关资源
      最近更新 更多