2017-07-05 11 views
0

sparkでオブジェクトをavro形式にシリアル化します。これらのオブジェクトには、バイト配列(編集:polylines、文字列として表されます)が含まれます。ファイルを調べると、データは正しいです。GenericRecordからByteBufferを抽出するときに余分な値があることがあります

$ java -jar ~/data/avro-tools-1.8.1.jar tojson part-00000.avro | grep 123 
{"key":123, "data":{"bytes":"gt_upA`mjrcE{Cw^uBwY"}} 
#^this example has been simplified for this question 

は、バイト配列の正しい文字列表現です。

次に、これらのファイルを私の普通のScalaアプリケーションでデシリアライズしようとします。ほとんどの値は正しく解析されますが、解析された配列には余分なバイトがあることがあります。

結果はgt_upA`mjrcE{Cw^uBwYBである。余分な末尾にはBがあることに注意してください。

ファイルを並行して解析していますが、ByteBufferインスタンスがスレッドセーフではなく、バッキングアレイが上書きされていると思います。

これらのファイルはどのように解析する必要がありますか?

編集:質問が立っている間、私はUTF-8文字列として値を直接符号化しています。これは解析時に追加作業を追加しますが、ByteBufferが同時に読み込むことができないという問題を回避します。

答えて

0

UTF-8として任意のバイナリデータを印刷することはできません。いくつかのバイトの組み合わせは無効またはあいまいであり、文字に変換することはよく定義されておらず、使用しているライブラリ(および端末設定)によって異なります。

だけではなく、hexademicalsとしてそれらを印刷:

byteBuffer.array.foreach { b => print("%02X".format(b)) } 
println 
+0

良い点を。ただし、これらの値はポリラインであり、定義によって印刷可能です。 – Synesso

関連する問題