Parquet 之mapreduce

原创 2016年06月16日 16:10:09

在mapreduce中使用Parquet,根据不同的序列化方式,有不同的选择,下面以Avro为例:
使用 AvroParquetInputFormat 和 AvroParquetOutputFormat

    @Override
    public int run(String[] strings) throws Exception {


        Path inputPath = new Path(strings[0]);
        Path outputPath = new Path(strings[1]);

        Job job = Job.getInstance(getConf(),"AvroParquetMapReduce");
        job.setJarByClass(getClass());

        job.setInputFormatClass(AvroParquetInputFormat.class);
        AvroParquetInputFormat.setInputPaths(job,inputPath);

        job.setMapperClass(Map.class);
        job.setReducerClass(Reduce.class);

        job.setOutputFormatClass(AvroParquetOutputFormat.class);
        FileOutputFormat.setOutputPath(job,outputPath);
        AvroParquetOutputFormat.setSchema(job,StockAvg.SCHEMA$);

        return job.waitForCompletion(true) ? 0 : 1;
    }

    static class Map extends Mapper<Void,Stock,Text,DoubleWritable>{

        @Override
        protected void map(Void key, Stock value, Context context) throws IOException, InterruptedException {
            context.write(new Text(value.getSymbol().toString()),new DoubleWritable(value.getOpen()));
        }
    }

    static class Reduce extends Reducer<Text, DoubleWritable, Void, StockAvg> {

        @Override
        protected void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {
            Mean mean = new Mean();

            for (DoubleWritable val :values){
                mean.increment(val.get());
            }

            StockAvg avg = new StockAvg();
            avg.setSymbol(key.toString());
            avg.setAvg(mean.getResult());
            context.write(null,avg);
        }
    }

这里的输入输出都是 Parquet文件。如果向输入是Text文件,只要不设置InputFormatClass即可。

如果改变input schema文件,Avro不能加载具体的class,会强制使用GenericData代替。

public class AvroProjectionParquetMapReduce extends Configured implements Tool {

    public static void main(String[] args) throws Exception {
        args = new String[2];

        args[0] = "hdfs://hadoop:9000/user/madong/parquet-input";
        args[1] = "hdfs://hadoop:9000/user/madong/parquet-output";

        int code = ToolRunner.run(new AvroProjectionParquetMapReduce(),args);
        System.exit(code);
    }

    @Override
    public int run(String[] strings) throws Exception {
        Path inputPath = new Path(strings[0]);
        Path outputPath = new Path(strings[1]);


        Job job = Job.getInstance(getConf(),"AvroProjectionParquetMapReduce");
        job.setJarByClass(AvroProjectionParquetMapReduce.class);

        job.setInputFormatClass(AvroParquetInputFormat.class);
        AvroParquetInputFormat.setInputPaths(job, inputPath);

        // predicate pushdown
        AvroParquetInputFormat.setUnboundRecordFilter(job, GoogleStockFilter.class);

        // projection pushdown
        Schema projection = Schema.createRecord(Stock.SCHEMA$.getName(),
                Stock.SCHEMA$.getDoc(), Stock.SCHEMA$.getNamespace(), false);
        List<Schema.Field> fields = Lists.newArrayList();
        for (Schema.Field field : Stock.SCHEMA$.getFields()) {
            if ("symbol".equals(field.name()) || "open".equals(field.name())) {
                fields.add(new Schema.Field(field.name(), field.schema(), field.doc(),
                        field.defaultValue(), field.order()));
            }
        }
        projection.setFields(fields);
        AvroParquetInputFormat.setRequestedProjection(job, projection);


        job.setMapperClass(Map.class);
        job.setReducerClass(Reduce.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(DoubleWritable.class);

        job.setOutputFormatClass(AvroParquetOutputFormat.class);
        FileOutputFormat.setOutputPath(job, outputPath);
        AvroParquetOutputFormat.setSchema(job, StockAvg.SCHEMA$);

        return job.waitForCompletion(true) ? 0 : 1;
    }

    public static class GoogleStockFilter implements UnboundRecordFilter {

        private final UnboundRecordFilter filter;

        public GoogleStockFilter() {
            filter = ColumnRecordFilter.column("symbol", ColumnPredicates.equalTo("GOOG"));
        }

        @Override
        public RecordFilter bind(Iterable<ColumnReader> readers) {
            return filter.bind(readers);
        }
    }

    static class Map extends Mapper<Void, Stock, Text, DoubleWritable> {

        @Override
        protected void map(Void key, Stock value, Context context) throws IOException, InterruptedException {
            if (value != null) {
                context.write(new Text(value.getSymbol().toString()),
                        new DoubleWritable(value.getOpen()));
            }
        }
    }

    static class Reduce extends Reducer<Text, DoubleWritable, Void, StockAvg> {

        @Override
        protected void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {
            Mean mean = new Mean();

            for (DoubleWritable val :values){
                mean.increment(val.get());
            }

            StockAvg avg = new StockAvg();
            avg.setSymbol(key.toString());
            avg.setAvg(mean.getResult());
            context.write(null,avg);
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

读写parquet格式文件的几种方式

摘要 文章地址:http://www.fanlegefan.com/index.php/2017/07/15/hive-parquet/ 博客地址:http://www.fanlegefan.com ...
  • woloqun
  • woloqun
  • 2017年07月25日 14:28
  • 5866

Spark SQL下的Parquet使用最佳实践和代码实战

一:Spark SQL下的Parquet使用最佳实践1,过去整个业界对大数据的分析的技术栈的Pipeline一般分为一下两种方式:A)Data Source -> HDFS -> MR/Hive/Sp...
  • sundujing
  • sundujing
  • 2016年05月17日 18:16
  • 7089

两种数据格式(Parquet/ORCfile)浅析

一、首先来看下ORCfile。 Orcfile(Optimized Row Columnar)是hive 0.11版里引入的新的存储格式,是对之前的RCFile存储格式的优化,是HortonWork...
  • u011750989
  • u011750989
  • 2015年12月11日 22:19
  • 5106

parquet-format-2.1.0-cdh5.5.0.tar.gz

  • 2016年03月07日 14:45
  • 1020KB
  • 下载

spark SQL学习parquet文件和people.json文件

  • 2018年01月03日 21:38
  • 742B
  • 下载

深入分析Parquet列式存储格式

Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0。 参考文献 ...
  • u012050154
  • u012050154
  • 2016年02月24日 20:01
  • 688

深入分析Parquet列式存储格式

Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目。1.列式存储列式存储和行式存储相比有哪些优...
  • bitcarmanlee
  • bitcarmanlee
  • 2016年12月17日 17:06
  • 608

深入分析Parquet列式存储格式

Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的版本是1.8.0。 列式存储 ...
  • xiaolang85
  • xiaolang85
  • 2016年05月05日 17:02
  • 604

第65课:SparkSQL下Parquet深入进阶学习笔记

第65课:SparkSQL下Parquet深入进阶 本期内容: 1  SparkSQL下的Parquet序列化 2  SparkSQL下的Parquet源码解读 3  SparkSQL下Parquet...
  • slq1023
  • slq1023
  • 2016年04月03日 19:24
  • 1153

spark sql编程之实现合并Parquet格式的DataFrame的schema

问题导读1.DataFrame合并schema由哪个配置项控制?2.修改配置项的方式有哪两种?3.spark读取hive parquet格式的表,是否转换为自己的格式?首先说下什么是schema,其实...
  • c36qUCnS2zuqF6
  • c36qUCnS2zuqF6
  • 2017年12月14日 00:00
  • 150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Parquet 之mapreduce
举报原因:
原因补充:

(最多只允许输入30个字)