2016-04-25 18 views
0

Javaのavro-parquetファイルからフィールドのサブセットを読み取るにはどうすればよいですか?JavaのAvro-Parquetファイルから特定のフィールドを読み取る方法は?

私は、格納されたレコードのサブセットであるavroスキーマを定義し、それらを読むことができると考えましたが、例外が発生します。 ClassBののフィールドがにClassAのサブセットです

  • クラスA
  • ClassBの

:ここ

は私が2つのアブロスキーマを持ってそれを解決するために

をしようとした方法です。

 final Builder<ClassB> builder = AvroParquetReader.builder(files[0].getPath()); 
     final ParquetReader<ClassB> reader = builder.build(); 
     //AvroParquetReader<ClassA> readerA = new AvroParquetReader<ClassA>(files[0].getPath()); 
     ClassB record = null; 
     final List<ClassB> list = new ArrayList<>(); 
     while ((record = reader.read()) != null) { 
      list.add(record); 
     } 

は、しかし、私はライン(record=reader.read())ClassCastExceptionを得る:Cannot convert ClassA to ClassB

私は読者がファイルからスキーマを読んでいるとします。

モデル(つまり、builder.withModel)で送信しようとしましたが、クラスB extends org.apache.avro.specific.SpecificRecordBaseから例外がスローされます。

Iイベントがありませんので、シガー...

答えて

1

構成でスキーマを設定し、builder.withConfigを通してそれを設定しようとしましたが...物事の

カップル:

  • AvroReadSupport.setRequestedProjection(hadoopConf, ClassB.$Schema)が可能選択された列の投影を設定するために使用されます。
  • reader.readNextメソッドはまだClassAオブジェクトを返しますが、ClassBに存在しないフィールドは無効にします。

直接あなたが次の操作を行うことができますリーダーを使用するには:

AvroReadSupport.setRequestedProjection(hadoopConf, ClassB.SCHEMA$); 
final Builder<ClassB> builder = AvroParquetReader.builder(files[0].getPath()); 
final ParquetReader<ClassA> reader = builder.withConf(hadoopConf).build(); 

ClassA record = null; 
final List<ClassA> list = new ArrayList<>(); 
while ((record = reader.read()) != null) { 
    list.add(record); 
} 

あなたはアブロ・寄木細工のファイルを読み取るためのInputFormatを使用することを計画している場合にも、便利なメソッドがある - ここにあります火花の例:

 final Job job = Job.getInstance(hadoopConf); 
     ParquetInputFormat.setInputPaths(job, pathGlob); 
     AvroParquetInputFormat.setRequestedProjection(job, ClassB.SCHEMA$); 

     @SuppressWarnings("unchecked") 
     final JavaPairRDD<Void, ClassA> rdd = sc.newAPIHadoopRDD(job.getConfiguration(), AvroParquetInputFormat.class, 
       Void.class, ClassA.class); 
関連する問題