热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大数据培训课程GroupingComparator分组案例实操

GroupingComparator分组案例实操1.需求有如下订单数据表4-2订单数据现在需要求出每一个订单中最贵的商品。(1)输

GroupingComparator分组案例实操

1.需求

有如下订单数据

表4-2 订单数据

现在需要求出每一个订单中最贵的商品。

(1)输入数据

(2)期望输出数据

1       222.8

2       722.4

3       232.8

2.需求分析

(1)利用“订单id和成交金额”作为key,可以将Map阶段读取到的所有订单数据按照id升序排序,如果id相同再按照金额降序排序,发送到Reduce。

(2)在Reduce端利用groupingComparator将订单id相同的kv聚合成组,然后取第一个即是该订单中最贵商品,如图4-18所示。

图4-18 过程分析

3.代码实现

(1)定义订单信息OrderBean类


package com.atguigu.mapreduce.order; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.WritableComparable;   public class OrderBean implements WritableComparable {     private int order_id; // 订单id号   private double price; // 价格     public OrderBean() {       super();   }     public OrderBean(int order_id, double price) {       super();       this.order_id = order_id;       this.price = price;   }     @Override   public void write(DataOutput out) throws IOException {       out.writeInt(order_id);       out.writeDouble(price);   }     @Override   public void readFields(DataInput in) throws IOException {       order_id = in.readInt();       price = in.readDouble();   }     @Override   public String toString() {       return order_id + “\t” + price;   }     public int getOrder_id() {       return order_id;   }     public void setOrder_id(int order_id) {       this.order_id = order_id;   }     public double getPrice() {       return price;   }     public void setPrice(double price) {       this.price = price;   }     // 二次排序   @Override   public int compareTo(OrderBean o) {         int result;         if (order_id > o.getOrder_id()) {          result = 1;       } else if (order_id o.getPrice() ? -1 : 1;       }         return result;   } }

(2)编写OrderSortMapper类


package com.atguigu.mapreduce.order; import java.io.IOException; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper;   public class OrderMapper extends Mapper {     OrderBean k = new OrderBean();     @Override   protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {             // 1 获取一行       String line = value.toString();             // 2 截取       String[] fields = line.split(“\t”);             // 3 封装对象       k.setOrder_id(Integer.parseInt(fields[0]));       k.setPrice(Double.parseDouble(fields[2]));             // 4 写出       context.write(k, NullWritable.get());   } }

(3)编写OrderSortGroupingComparator类


package com.atguigu.mapreduce.order; import org.apache.hadoop.io.WritableComparable; import org.apache.hadoop.io.WritableComparator;   public class OrderGroupingComparator extends WritableComparator {     protected OrderGroupingComparator() {       super(OrderBean.class, true);   }     @Override   public int compare(WritableComparable a, WritableComparable b) {         OrderBean aBean = (OrderBean) a;       OrderBean bBean = (OrderBean) b;         int result;       if (aBean.getOrder_id() > bBean.getOrder_id()) {          result = 1;   } else if (aBean.getOrder_id()

(4)编写OrderSortReducer类


package com.atguigu.mapreduce.order; import java.io.IOException; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.mapreduce.Reducer;   public class OrderReducer extends Reducer {     @Override   protected void reduce(OrderBean key, Iterable values, Context context)     throws IOException, InterruptedException {             context.write(key, NullWritable.get());   } }

(5)编写OrderSortDriver类


package com.atguigu.mapreduce.order; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;   public class OrderDriver {     public static void main(String[] args) throws Exception, IOException {   // 输入输出路径需要根据自己电脑上实际的输入输出路径设置       args  = new String[]{“e:/input/inputorder” , “e:/output1”};         // 1 获取配置信息       Configuration cOnf= new Configuration();       Job job = Job.getInstance(conf);         // 2 设置jar包加载路径       job.setJarByClass(OrderDriver.class);         // 3 加载map/reduce类       job.setMapperClass(OrderMapper.class);       job.setReducerClass(OrderReducer.class);         // 4 设置map输出数据key和value类型       job.setMapOutputKeyClass(OrderBean.class);       job.setMapOutputValueClass(NullWritable.class);         // 5 设置最终输出数据的key和value类型       job.setOutputKeyClass(OrderBean.class);       job.setOutputValueClass(NullWritable.class);         // 6 设置输入数据和输出数据路径       FileInputFormat.setInputPaths(job, new Path(args[0]));       FileOutputFormat.setOutputPath(job, new Path(args[1]));        // 8 设置reduce端的分组   job.setGroupingComparatorClass(OrderGroupingComparator.class);         // 7 提交       boolean result = job.waitForCompletion(true);       System.exit(result ? 0 : 1);   } }

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 标题: ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
author-avatar
小白学习
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有