問題タブ [avro]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - フィールドをプリミティブから共用体に進化させるための Avro スキーマ解決
Java の汎用表現 APIを使用して Avro 1.7.0 を使用していますが、現在のスキーマ進化のケースに対処するのに問題があります。ここで扱っているシナリオは、フィールドをnull
とそのプリミティブ型の和集合に変更することによって、プリミティブ型フィールドをオプションにすることです。
簡単な例を使用します。基本的に、スキーマは次のとおりです。
- 初期: タイプのフィールドが 1 つあるレコード
int
- 2 番目のバージョン: 同じレコード、同じフィールド名ですが、型は と の和集合に
null
なりましたint
Avro の仕様のスキーマ解決の章によると、このような場合の解決策は次のようになります。
リーダーが共用体であるが、ライターがそうでない場合
ライターのスキーマと一致するリーダーの共用体の最初のスキーマは、それに対して再帰的に解決されます。一致するものがない場合、エラーが通知されます。
私の解釈では、最初のスキーマでシリアル化されたデータint
は、リーダーのスキーマのユニオンの一部であるため、適切に解決する必要があります。
ただし、バージョン 1 でシリアル化されたレコードをバージョン 2 を使用して読み戻すテストを実行すると、
org.apache.avro.AvroTypeException: Attempt to process a int when a union was expected.
これを正確に示すテストを次に示します。
私の期待が正しいかどうか (これは正常に解決されるはずですか?)、またはそのようなシナリオを処理するために avro を適切に使用していない場所を知りたいです。
apache-pig - pig で avro を使用して複数のファイルをロードおよび保存するときのランタイム例外
複数のテキスト形式のファイルを読み込んで、pig を使用してそれらを avro 形式に変換しようとすると、この奇妙な問題が発生します。ただし、一度に 1 つのファイルを別々に実行して読み取って変換すると、すべて問題ありません。エラーメッセージは次のとおりです
2012-08-21 19:15:32,964 [メイン] エラー org.apache.pig.tools.grunt.GruntParser - エラー 2997: バックアップされたエラーから例外を再作成できません: org.apache.avro.file.DataFileWriter$AppendWriteException: java .lang.RuntimeException: Datum 1980-01-01 00:00:00.000 is not in union ["null","long"] at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:263) at org .apache.pig.piggybank.storage.avro.PigAvroRecordWriter.write(PigAvroRecordWriter.java:49) org.apache.pig.piggybank.storage.avro.AvroStorage.putNext(AvroStorage.java:612) org.apache.pig で.backend.hadoop.executionengine.mapReduceLayer.PigOutputFormat$PigRecordWriter.write(PigOutputFormat.java:139) at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigOutputFormat$PigRecordWriter.write(PigOutputFormat.java:98) at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.write(MapTask.java:531) at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80) at org org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigGenericMapB の .apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigMapOnly$Map.collect(PigMapOnly.java:48)backend.hadoop.executionengine.mapReduceLayer.PigGenericMapBbackend.hadoop.executionengine.mapReduceLayer.PigGenericMapB
私のコードは
最初のファイルは正常に変換されますが、2 番目のファイルは失敗します。エラーは 2 番目のファイルの 2 番目のフィールドから発生していますが、奇妙なことに、エラー メッセージに ["null","long"] が表示されているのに、スキーマに "long" すらありません。
私は pig 0.10.0 と avro-1.7.1.jar を使用しています。
これはバグなのか、何かを見逃したのだろうか。
ありがとう。ダン
ここにset1.txtがあります
ここにset2.txtがあります
protocol-buffers - Avro スキーマの進化には、古いスキーマと新しいスキーマの両方へのアクセスが必要ですか?
スキーマ バージョン 1 を使用してオブジェクトをシリアル化し、後でスキーマをバージョン 2 に更新した場合 (フィールドを追加するなど)、後でオブジェクトを逆シリアル化するときにスキーマ バージョン 1 を使用する必要がありますか? 理想的には、スキーマ バージョン 2 のみを使用し、オブジェクトが最初にシリアル化された後にスキーマに追加されたフィールドのデフォルト値を逆シリアル化されたオブジェクトに持たせたいと考えています。
たぶん、いくつかのコードがよりよく説明されます...
スキーマ 1:
スキーマ 2:
一般的な非コード生成アプローチを使用:
結果は EOFException になります。jsonEncoder
結果を AvroTypeException で使用する。
schema1 と schema2 の両方をコンストラクターに渡すとうまくいくことはわかっていGenericDatumReader
ますが、以前のすべてのスキーマのリポジトリを保持する必要はなく、特定のオブジェクトをシリアル化するためにどのスキーマが使用されたかを追跡する必要もありません。
また、コード生成アプローチも試しました。最初に、schema1 から生成された User クラスを使用してファイルにシリアル化します。
次に、スキーマをバージョン 2 に更新し、User クラスを再生成して、ファイルの読み取りを試みます。
しかし、EOFException も発生します。
比較のために、私がやろうとしていることはprotobufsで動作するようです...
フォーマット:
シリアライズ:
オプションの last_name を format に追加し、UserProto を再生成し、逆シリアル化します。
予想どおり、user.getLastName()
空の文字列です。
このようなことは Avro で実行できますか?
scala - avrosをメモリ内からScalaケースクラスに逆シリアル化できますが、ファイルからではないのはなぜですか?レコードをケースクラスにキャストできませんか?
Salat-Avroを使用してScalaケースクラスをシリアル化および逆シリアル化しようとしています。
メモリ内で正常にシリアル化および逆シリアル化できますが、ファイルにしかシリアル化できません。フォームファイルをまだ逆シリアル化できません。
ストリームから読み取るときのように、ファイルから読み取るときにDatumReaderが成功しないのはなぜですか?
コードは次のとおりです。
val obj2 = grater[Record].asObjectFromDataFile(infile)
呼び出し:
} `
コードはGithub.comでも見ることができます: Salat-Avro-Example.scalaおよび Salat-Avro.avrograter.scala
これを修正するにはどうすればよいですか?ありがとう!
java - pig での AvroStorage() の使用
Java で最初の Pig UDF をビルドしようとしていますが、Eclipse でビルドするときに関数を呼び出すのに問題があります。私のコードは次のようになります。
登録 /home/user2/deb/deb/avro-1.4.0.jar 登録 /home/user2/deb/deb/json-simple-1.1.jar 登録 /home/user2/deb/deb/piggybank.jar 登録 /home /user2/deb/jackson-core-asl-1.5.5.jar レジスター /home/user2/deb//jackson-mapper-asl-1.5.5.jar
C = FOREACH avro GENERATE masking.AccountMask(accntNo); ダンプ C;
hadoop - piggybank と AvroStorage を使用した EMR のトラブルに対処する
Avro 形式で保存されたデータを読み取る EMR で豚のスクリプトを実行しています。ローカルで動作していましたが、スクリプトの他の部分を EMR で動作させるために、使用していた piggybank.jar を 0.10.0 ではなく 0.9.2 に戻す必要がありました。その変更を行った後、AvroStorage は暗黙のうちにデータの読み取りに失敗し、ゼロ レコードを返すだけです。ログなどには何も言及されていません。スクリプトは次のとおりです。
また、piggybank.jar がバージョン 0.10.0 の場合、動作します。バージョン 0.9.2 の場合はありません。他のライブラリの別のバージョンを使用する必要がありますか? avro-1.5.3.jar で試してみましたが、これもうまくいきませんでした。
別の注意:そうするとdescribe a;
、スキーマが正しく出力されます。
java - Javaで共用体型のAvro配列を処理するにはどうすればよいですか?
次のような IDL を使用して定義された Avro スキーマがあります。
このスキーマから自動生成された Java クラスを使用しています。アイテム配列に入れることができるのはギズモとガジェットだけではありませんが、すべてに名前とコストがあると規定しましょう。
私の理解では、Avro レコードの継承を指定する方法はないためgetItems()
、Order オブジェクトでは必ずList<Object>
. とはいえ、もう少しコンテキストと型安全性を備えたものが欲しいです。これまでに 3 つのアプローチを思いつきましたが、どれもあまり口に合いそうにありません。
アプローチ 1: への未チェックのキャストを実行しList<SpecificRecord>
(実際には へのキャスト、次にジェネリクスのしくみによりList
への別のキャスト) 、 name と cost がそれぞれフィールド 1 と 2 になることを知って、 を使用します。それらを取得したら、適切な型にもキャストする必要があります。これは信じられないほど壊れやすいようです。List<SpecificRecord>
get(int field)
アプローチ 2:項目配列を反復処理し、各項目を個別にキャストします。最初のアプローチのように、indexed getにキャストしSpecificRecord
て使用するか、一連のinstanceof
チェックを実行してから名前でフィールドを取得することができます。これは壊れやすいか、面倒です。
アプローチ 3:SpecificRecord
適切なクラス階層を実装して持つ独自のクラスを作成します。これはコードを自動生成する利点を失いますが、最も堅牢なオプションのように見えますが、非常に手間がかかります。
これらのうちどれが最高ですか? または、より良いオプションがありますか?
java - JavaでAVROを使用して日付をシリアル化する方法
私は実際にAvroで日付を含むオブジェクトをシリアル化しようとしていますが、逆シリアル化された日付が期待値と一致しません(avro 1.7.2および1.7.1でテスト済み)。これが私がシリアル化しているクラスです:
シリアル化/逆シリアル化に使用されるコード:
そして出力:
それは既知のバグに関連していますか、それともオブジェクトをシリアル化する方法に関連していますか?