大数据下利用二次排序的算法实现气象数据的排序

思路: 

原始数据:(原始数据可以从ncdc的气象数据获取到)

年,月,日,温度 

1901,07,12,289
1901,07,13,267
1901,07,14,261
1901,07,15,278
1901,07,16,300
1901,07,17,278

1932,06,27,389
1932,06,28,400
1932,06,29,368
1932,06,30,372
1932,07,01,374

实现后的结果

1901-07,261,267,278,278,289,300

1932-06,368,372,389,400

1932-07,374

新的排序以年-月为键值,温度为值,将温度进行了排序,

方案一: 直接map读取数据,对数据进行拆分,新的key和value分配完,规约至reduce,在reduce处理中,对值进行排序

                优点: 处理简单          缺点: 数据量大,内存不够用

                所以在大数据量的情况下,基本不可用。

方案二: 使用MapReduce框架对归约器进行排序,依赖于hadoop框架,这样在hadoop框架下,内存不在是瓶颈,不会发生

                内存溢出。

                设计思路: 1 构造中间键,组合键起到即可做键值,又能排序的作用。

                                    2 利用组合键,在mapreduce框架中,完成排序。

                                    3 通过归约器的分区器,实现根据组合键的状态来完成分区和排序。

                实现内容:

                       1 实现数据结构,包含组合键的类,完成类的compareTo()(实现升序或降序)函数,用来进行排序。

                                                (Writable接口实现数据持久化)

                       2 实现定制的分区器,用来在进入某个归约服务器时进行分区; 通过hashCode进行分区。

                       3 实现分组比较器,用来控制进入归约服务器的分组,需要进入哪个Rudecer.reduce()调用

               map:   逐行读入数据,提取出日期和温度信息,按照自定义数据结构格式,保存好数据,准备进入规约器。

               reduce: 接收到的根据组合键分区排序,并经过分组比较器筛选,进入指定reduce()中的数据。

                               数据进来已经排好序,reduce对数据进行处理后存储或者保存。

            在job中增加两个实现:

                         job.setPartitionerClass(定制分区器.class)

                         job.setGroupingComparatorClass(分组比较器.class)

 

数据处理: 直接将如下链接中的数据,读入map即可,此输入是gz压缩格式,hadoop默认支持直接读取;

                   可以从本地读取,也可以事先存入hdfs,但因为大量小文件,会生成很多文件分片,所以要考虑

                    小文件的问题,后续会写文章专门讨论这个问题。

 代码上传在github上:https://github.com/coolbin1977/hadoopSecondSort.git

 

美国气象数据下载链接:1901-1942 https://download.csdn.net/download/neo_lee/11270800

                                        1943-1944 https://download.csdn.net/download/neo_lee/11270841

                                         1 945-1947 https://download.csdn.net/download/neo_lee/11270906

        因为从40年代开始,此数据年数据量逐渐偏大,到2000年以后都要2G有余,所以上传,个人上传显示220兆,所以分了3个文件,关于下载积分,是csdn默认加上的,不知道怎么去除,我本意是免费提供下载的,有人知道如何去除,可以留言,我自己也研究一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值