0

2 つの異なるシナリオで、同じクラスに異なるコーダーを使用しようとしています。

  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 つの形式はバイナリ互換性がなく、いくつかの最適化により、2 番目のコーダーは最初のコーダーのみが読み取ることができるデータ形式に使用されるようです。

4

1 に答える 1

1

はい、そのように 2 つの異なるコーダーを使用するとうまくいくはずです。(#2 のコーダーは、システムがサラウンド計算に最適化する代わりに「データ」を永続化することを選択した場合にのみ使用されることに注意してください。)

独自の Coder を使用していますか、それとも Dataflow SDK で提供されているものを使用していますか? TextIO に関する簡単な警告 -- 改行を使用して要素の境界をエンコードするため、改行と間違われる可能性のあるものを含むエンコードされた値を生成するコーダーを使用すると、問題が発生します。TextIO 内ではテキスト エンコーディングのみを使用する必要があります。将来、それをより明確にすることを望んでいます。

于 2015-01-06T05:00:55.637 に答える