やあ 私が持っている Pojos で parquest を書くための API を探しています。リフレクションを使用して avro スキーマを生成し、AvroSchemaConverter を使用して寄木細工のスキーマを作成することができました。また、Pojos を GenericRecords (avro) に変換する方法を見つけることができません。それ以外の場合は、AvroParquetWriter を使用して Pojos を寄木細工のファイルに書き出すことができたはずです。助言がありますか ?
3 に答える
avro を通過する場合は、次の 2 つのオプションがあります。
1) avro に pojo を生成させます (こちらのチュートリアルを参照してください)。生成された pojo は、AvroParquetWriter で使用できる SpecificRecord を拡張します。
2) pojo から GenericRecord への変換を自分で記述します。これは手動で行うことも、より一般的な解決策としてリフレクションを使用することもできます。ただし、データを読み取ろうとしたときに、このアプローチでは問題が発生しました。提供されたスキーマに基づいて、avro はクラスパスで pojo を見つけ、GenericRecord の代わりに SpecificRecord をインスタンス化しようとしました。このため、オプション 1 を選択しました。
Parquet は、pojo の直接書き込みもサポートするようになりました。これは寄木細工のgithubページのプル リクエストです。ただし、これはまだ正式リリースの一部ではないと思います。つまり、Maven でこのコードが見つかりませんでした。
免責事項: 次のコードは、急いで書いたものです。これは効率的ではなく、寄木細工の将来のバージョンでは、これをより直接的に修正する予定です。そうは言っても、これは必要なものに対する軽量で非効率的なアプローチです。作戦はPOJO→AVRO→PARQUET
- POJO -> AVRO: リフレクションを介してスキーマを宣言します。スキーマに基づいてライターとリーダーを宣言します。変換時にオブジェクトをバイト ストリームに書き込み、avro として読み戻します。
- AVRO -> Parquet: parquet-me プロジェクトに含まれている AvroParquetWriter を使用します。
private static final Schema avroSchema = ReflectData.AllowNull.get().getSchema(YOURCLASS.class);
private static final ReflectDatumWriter<YOURCLASS> reflectDatumWriter = new ReflectDatumWriter<>(avroSchema);
private static final GenericDatumReader<Object> genericRecordReader = new GenericDatumReader<>(avroSchema);
public GenericRecord toAvroGenericRecord() throws IOException {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
reflectDatumWriter.write(this, EncoderFactory.get().directBinaryEncoder(bytes, null));
return (GenericRecord) genericRecordReader.read(null, DecoderFactory.get().binaryDecoder(bytes.toByteArray(), null));
}
もう 1 つ: 寄木細工のライターは現在、null フィールドについて非常に厳格なようです。寄木細工への書き込みを試みる前に、どのフィールドも null でないことを確認してください