【大数据分析常用算法】1.二次排序

本文介绍了在MapReduce中实现二次排序的原理和步骤,用于在reducer阶段对键关联的值进行排序。通过自定义分组比较器、Reducer逻辑和分区器,解决了在大数据分析中对多列数据进行排序的需求。
摘要由CSDN通过智能技术生成

简介

本算法教程系列建立在您已经有了spark以及Hadoop的开发基础,如果没有的话,请观看本博客的hadoop相关教程或者自行学习,代码会在博客文档写到一定程度统一放到github下。

二次排序是指在reducer阶段对与某个键关联的值进行排序,也叫作值转换。

MapReduce框架会自动对映射器生成的键进行排序。这说明,在reducer阶段准备执行之前,他获得的数据必然是按键有序的(而不是值)。传入各个reducer的值并不是有序的,他们的顺序我们无法确定(取决于资源调配过程的处理顺序)。我们的实际需求中,对值的排序情况是很常见的。为了解决这种问题,我们需要用到二次排序的设计模式。

二次排序问题是指在reducer阶段对与某个键关联的值进行排序,也叫作值转换。为了理解方便,我们定义一般的MapReduce处理过程的公式如下: $$ map(key_{1},value_{1}) => list(key_{2}, value_{2}) $$ $$ reduce(key_{2},list(value_{2})) => list(key_{3},value_{3}) $$

我们对这两个公式进行说明:首先,map函数接受一个k1-v1,然后他会输出任何数量的k2-v2对。接下来,reduce函数接收另一个k-list(v)作为输入,然后将其进行处理,输出另一个k-v。

显然reduce函数的输入list(value_{2})中的{v1,v2,vn....}是一个无序的,二次排序的目的就是让他们变得有序!因此,我们可以根据上面的公式的模式来定义二次排序的公式,如下所示: $$ map(key_{1},value_{1}) => list(key_{2}, value_{2}) $$ $$ sort(V_{1},V_{2}....V_{n}) => ({S_{1},S{2}}...S_{n}) $$ V代表无序变量,S代表有序变量。

和之前一样,学以致用。既然理解了二次排序的概念,我们就来通过一些能够举一反三的用例来掌握二次排序的设计模式。

1、案例

1.1、需求

假定我们有如下的温控数据。

2018,01,01,10
2018,01,02,5
2018,01,03,3
2018,01,04,12
2016,11,05,20
2016,11,15,30
2016,03,25,11
2016,04,22,19
2015,06,11,22
2015,06,10,33
2015,07,08,21
2015,02,06,5
2017,11,05,5
2017,11,04,0
2017,02,02,3
2017,02,03,9
2014,06,11,22
2014,06,10,33
2014,07,08,21
2014,07,06,5

该数据是按逗号分隔的每一行,分别代表年、月、日以及当天的温度。用公式表现为 $$ L_{0}=Year,L_{1}=Month,L_{2}=Day,L_{3}=Temperature,S=',' $$ 其中L代表列的意思,下标代表列所以(从0计数),S代表分隔符号,这里的分隔符是英文逗号,整个文件以UTF-8编码(若数据不含中文可以不必在意)。

现在我们要求处理这段数据,按年月排序倒叙输出的同时(忽略天气),统计各个月之内温度的变化趋势,同样按温度的降序排列,输出在同一行,下面是输出范例:

2018-01	12,10,5,3
2017-11	5,0
2017-02	9,3
2016-11	30,20
...
...

需求公式如下: $$ V(List(dateAndTemperature)) => S(List(date, S(Listtemparature)))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值