如何为Java中的Hadoop作业定义ParquetOutputFormat的镶木地板模式?

时间:2017-03-16 12:44:06

标签: java hadoop mapreduce parquet

我在java中有一个Hadoop作业,它有序列输出格式:

job.setOutputFormatClass(SequenceFileOutputFormat.class);

我想改用Parquet格式。我试图以天真的方式设置它:

job.setOutputFormatClass(ParquetOutputFormat.class);
ParquetOutputFormat.setOutputPath(job, output);
ParquetOutputFormat.setCompression(job, CompressionCodecName.GZIP);
ParquetOutputFormat.setCompressOutput(job, true);

但是当把作业的结果写入磁盘时,bob失败了:

Error: java.lang.NullPointerException: writeSupportClass should not be null
    at parquet.Preconditions.checkNotNull(Preconditions.java:38)
    at parquet.hadoop.ParquetOutputFormat.getWriteSupport(ParquetOutputFormat.java:326)

看来,实木复合地板需要设置一个模式,但我找不到手册或指南,在我的情况下如何做到这一点。 我的Reducer课程尝试使用org.apache.hadoop.io.LongWritable作为关键字,org.apache.mahout.cf.taste.hadoop.EntityEntityWritable作为值,在每行记下3个长值。

如何为此定义架构?

1 个答案:

答案 0 :(得分:2)

您必须指定" parquet.hadoop.api.WriteSupport"妨碍你的工作。 (例如:" parquet.proto.ProtoWriteSupport" for protoBuf或" parquet.avro.AvroWriteSupport" for avro)

ParquetOutputFormat.setWriteSupportClass(job, ProtoWriteSupport.class);

使用protoBuf时,请指定protobufClass:

 ProtoParquetOutputFormat.setProtobufClass(job, your-protobuf-class.class);

当使用avro时,引入这样的架构:

AvroParquetOutputFormat.setSchema(job, your-avro-object.SCHEMA);