2017-04-12 34 views
2

クラスタメトリックを取得し、古いバージョンのCloudera APIを使用してHDFSファイルにデータを書き込むスケジューラがあります。しかし、最近、JARと元のコードエラーを例外で更新しました。Apache Parquet形式でデータを書き込む

java.lang.ClassCastException: org.apache.hadoop.io.ArrayWritable cannot be cast to org.apache.hadoop.hive.serde2.io.ParquetHiveRecord 
at org.apache.hadoop.hive.ql.io.parquet.write.DataWritableWriteSupport.write(DataWritableWriteSupport.java:31) 
at parquet.hadoop.InternalParquetRecordWriter.write(InternalParquetRecordWriter.java:116) 
at parquet.hadoop.ParquetWriter.write(ParquetWriter.java:324) 

ParquetHiveRecordクラスを使用する際には、寄せ集め形式のデータ(POJO)を記述する必要があります。 (タイプParquetWriterの) "作家" の

Writable[] values = new Writable[20]; 
... // populate values with all values 
ArrayWritable value = new ArrayWritable(Writable.class, values); 
writer.write(value); // <-- Getting exception here 

詳細:以下

コードサンプル

MessageType schema = MessageTypeParser.parseMessageType(SCHEMA); // SCHEMA is a string with our schema definition 
ParquetWriter<ArrayWritable> writer = new ParquetWriter<ArrayWritable>(fileName, new 
DataWritableWriteSupport() { 
    @Override 
    public WriteContext init(Configuration conf) { 
     if (conf.get(DataWritableWriteSupport.PARQUET_HIVE_SCHEMA) == null) 
      conf.set(DataWritableWriteSupport.PARQUET_HIVE_SCHEMA, schema.toString()); 
    } 
}); 

はまた、我々は今5.8を使用して、前CDHとCM 5.5.1を使用していました。 3

ありがとうございます!

+0

コードはありません。あなたのソースコードを提供してください –

+0

確かに、コードサンプルで質問を更新しました。 –

答えて

0

ParquetWriterではなくDataWritableWriterを使用する必要があると思います。クラスキャスト例外は、書き込みサポートクラスがArrayWritableではなくParquetHiveRecordのインスタンスを予期していることを示します。 DataWritableWriterはの形式で個々のメッセージにArrayWritableの個々のレコードを分解し、それぞれを書き込みサポートに送信します。

時折、寄木張りが気になるところです。 :)

+0

お返事ありがとうございます!私は 'DataWritableWriter'を使ってみましたが、' RecordConsumer'クラスが何のために使用されるのか分かりませんでした! :( 可能であれば、例を挙げてもらえますか? –

0

DataWritableWriteSupportクラスのコードを見てください: https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/io/ parquet/write/DataWritableWriteSupport.java DataWritableWriterを使用していることがわかります。したがって、DataWritableWriterのインスタンスを作成する必要はありません。書き込みサポートのアイデアは、さまざまな書式を寄せ集めることができるということです。

あなたが必要とするのは、ParquetHiveRecordで書き込み可能なものをラップすることです。

関連する問題