我在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个长值。
如何为此定义架构?
答案 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);