在hadoop的mapreduce中,提供了对于客户端的自定义排序的功能相关api
mapreduce根据输入记录的键值对数据集总体排序,确保输出的文件内部数据有序
最终的输出结果只有一个文件,且内部有序,实现方式是只设置一个reducetask,但是这种做法在处理的某个文件特别大的时候,效率会非常低,这也就丧失了mapreduce提供的并行处理任务的能力
在reduce端对key进行分组,比如说,在接收的key为bean对象的时候,想让一个或多个字段相同的key进入到同一个reduce方法时,可以采用分组排序
在自定义排序中,compareto的判断条件为两个或者多个时即为二次排序
还记得在序列化一篇中,那个针对手机号的峰值流量和峰谷流量的例子吧,我们直接以该案例的输出结果为输入数据,对大写汉语拼音字母歌这个结果文件中按照总流量进行排序
期望输出数据的格式如:
实现该接口后,重写compareto方法,需要排序的字段逻辑就在compareto中编写
设想一下,既然数据能排序,map阶段输出的key应该为自定义的可比较的对象,即为上面的这个bean,value为手机号
reduce阶段的输出结果仍然以手机号为key,而value为排序后的自定义的bean
运行上面的程序,观察输出结果,可以看到,总流量按照从大到小的顺序进行了排序
可以看到,最后的3行数据中,总流量相同,如果这时候又提出一个需求,当总流量相同时,再按照峰值流量进行排序,该怎么高中物理有多难做呢?
其实只需要在自定义的bean中的compareto方法里面继续添加排序逻辑即可
绘本小故事业务需求,上面的案例中,我们进一步提出新的需求,针对不同的手机号最终写到不同的文件中,那蒹葭赏析么在上面的基础上,还需要结合自定义分区的逻辑
需要改造的包括2点:
添加一个自定义分区器,按照业务规则指定分区号改造driver类,添加自定义分区器,设置mapreducetask任务个数其他的逻辑和上面的保持一致即可
运行上面的程序,然后随机打开其中的两个文件检查下是否满足上面的需求,可以看到,文件最终输出到4个分区文件下,并且每个分区文件内的总流量也是按照从高到低的顺序
到此这篇关于hadoop 详解如何实现数据排序的文章就介绍到这了,更多相关hadoop 数据排序内容请搜索www.8875搞笑动态图片吧51.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-05 20:35:06,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/71760b79882e8c92222b4e22d1ec7d09.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:hadoop 详解如何实现数据排序.doc
本文 PDF 下载地址:hadoop 详解如何实现数据排序.pdf
留言与评论(共有 0 条评论) |