2017-04-12 92 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()); 
    } 
}); 

而且,我們以前使用CDH和CM 5.5.1,現在用5.8。 3

謝謝!

+0

沒有任何代碼,我們不能幫你。請提供您的源代碼 –

+0

當然,用代碼示例更新了問題。 –

回答

0

我認爲你需要使用DataWritableWriter而不是ParquetWriter。類別轉換異常表示寫支持類期望ParquetHiveRecord而不是ArrayWritable的實例。 DataWritableWriter可能將ArrayWritable中的單個記錄分解爲ParquetHiveRecord形式的單個消息,並將每個記錄發送給寫支持。

實木複合地板是有時心靈彎曲的某種。 :)

+0

感謝您的回覆!我曾嘗試使用'DataWritableWriter',但我不明白'RecordConsumer'類應該用於什麼! :( 如果可能的話,你可以舉一個例子嗎?我試了一整天,試圖理解它,並使其工作。 –

0

查看DataWritableWriteSupport類的代碼: https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/io/實木複合地板/寫/ DataWritableWriteSupport.java 您可以看到它使用的是DataWritableWriter,因此您不需要創建DataWritableWriter的實例,Write支持的想法是您可以爲拼花地板編寫不同的格式。

你需要做的是將你的可寫入包裝在ParquetHiveRecord中