以Apache Parquet格式写入数据

时间:2017-04-12 21:52:48

标签: java hadoop parquet

我有一个调度程序来获取我们的集群指标,并使用旧版本的Cloudera API将数据写入HDFS文件。但最近,我们更新了我们的JAR和原始代码错误,但有例外。

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)。

以下代码示例:

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

&#34;作家&#34;的详情(ParquetWriter类型):

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

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为您需要使用DataWritableWriter而不是ParquetWriter。类强制转换异常表示写支持类期望ParquetHiveRecord而不是ArrayWritable的实例。 DataWritableWriter可能会将ArrayWritable中的各个记录细分为ParquetHiveRecord形式的单个邮件,并将每个邮件发送给写支持。

Parquet有时会弯曲。 :)

答案 1 :(得分:0)

查看DataWritableWriteSupport类的代码: https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/write/DataWritableWriteSupport.java 您可以看到它正在使用DataWritableWriter,因此您不需要创建DataWritableWriter的实例,Write支持的想法是您可以将不同的格式写入镶木地板。

您需要的是将您的可写文件包装在ParquetHiveRecord