数据算法 --hadoop/spark数据处理技巧 --(1.二次排序问题 2. TopN问题)
一、二次排序问题。

MR/hadoop两种方案:
1.让reducer读取和缓存给个定键的所有值(例如,缓存到一个数组数据结构中,)然后对这些值完成一个reducer中排序。这种方法不具有可伸缩性,因为reducer要接受一个给定键的所有值,这种方法可能导致reducer的内存耗尽(OOM)。另一方面,如果值数量很少,就不会导致内存溢出,那么这种方法可行。
2.使用MR框架对reducer的值排序(这样一来,就不再需要对传入reducer的值完成排序。)这种方法“会为自然键增加部分或整个值来创建一个组合键以实现排序目标”(参考 java Code Geeks)。这种方法可伸缩,不会产生内存溢出错误。在这里,排序工作基本上由MR框架来完成。
使用MR框架的二次排序设计模式,规约器值到达时就是有序地。(也就是说,不再需要在内存中对值进行排序)。这种技术使用了MR框架的洗牌和排序技术完成规约器值的排序。这种解决方案比1更可取,不再依赖内存完成排序。
思考分析:对返回数据形式进行分析,自定义对象和reducer的分区策略。(当然为了实现排序,要对自定义的对象进行实现comparele接口,重写compare方法。)
spark两种方案:
1.将一个给定键的所有值读取缓存到一个List数组结构中,然后对这些值完成排序。优缺点同MR方案1.
2.使用Spark框架对规约器值排序(这种做法不需要对传入规约器的值完成规约器中排序)。这种方法“会为自然建增加部分或整个值来创建一个组合键以实现排序目标。”
二。 Top N问题。
列表L的TopN 算法大致描述:L列表的元素是一个scala的tuple结构,通过java的TreeMap将一个tuple添加到其中,然后对TreeMap进>N的if操作,来进行remove操作。
1.唯一键。
例子:

在这个问题上,可以使用一个规约器完成对所有数据的接收,所有压力和负载全部是都在这一个节点上。在这里不糊带来性能问题,为什么呢。假设有由1000个映射,每个映射器只会生成10个键值对,因为,这个规约器只会得到10*1000个记录,这个数据量还不至于导致性能瓶颈。

2.非唯一键
例子:

topN设计模式:这里假设所有K不是唯一的,主要步骤:
①。确保所有K是唯一的。要保证K是唯一的(存在不唯一的,直接把相同的K的V相加。),我们要把输入映射到JavaPairRDD<K,V>对,然后交给reduceByKey().
②。将所有唯一的(K,V)对划分为M个分区。
③。找出个个分区的Top N。
④。找出所有本地topN的最终top N.

数据算法 --hadoop/spark数据处理技巧 --(1.二次排序问题 2. TopN问题)的更多相关文章
- 数据算法 --hadoop/spark数据处理技巧 --(5.移动平均 6. 数据挖掘之购物篮分析MBA)
五.移动平均 多个连续周期的时间序列数据平均值(按相同时间间隔得到的观察值,如每小时一次或每天一次)称为移动平均.之所以称之为移动,是因为随着新的时间序列数据的到来,要不断重新计算这个平均值,由于会删 ...
- 数据算法 --hadoop/spark数据处理技巧 --(9.基于内容的电影推荐 10. 使用马尔科夫模型的智能邮件营销)
九.基于内容的电影推荐 在基于内容的推荐系统中,我们得到的关于内容的信息越多,算法就会越复杂(设计的变量更多),不过推荐也会更准确,更合理. 本次基于评分,提供一个3阶段的MR解决方案来实现电影推荐. ...
- 数据算法 --hadoop/spark数据处理技巧 --(11.K-均值聚类 12. k-近邻)
十一.k-均值聚类 这个需要MR迭代多次. 开始时,会选择K个点作为簇中心,这些点成为簇质心.可以选择很多方法啦初始化质心,其中一种方法是从n个点的样本中随机选择K个点.一旦选择了K个初始的簇质心,下 ...
- 数据算法 --hadoop/spark数据处理技巧 --(3.左外连接 4.反转排序)
三. 左外连接 考虑一家公司,比如亚马逊,它拥有超过2亿的用户,每天要完成数亿次交易.假设我们有两类数据,用户和交易: users(user_id,location_id) transactions( ...
- 数据算法 --hadoop/spark数据处理技巧 --(17.小文件问题 18.MapReuce的大容量缓存)
十七.小文件问题 十八.MR的大容量缓存 在MR中使用和读取大容量缓存,(也就是说,可能包括数十亿键值对,而无法放在一个商用服务器的内存中).本次提出的算法通用,可以在任何MR范式中使用.(eg:MR ...
- 数据算法 --hadoop/spark数据处理技巧 --(13.朴素贝叶斯 14.情感分析)
十三.朴素贝叶斯 朴素贝叶斯是一个线性分类器.处理数值数据时,最好使用聚类技术(eg:K均值)和k-近邻方法,不过对于名字.符号.电子邮件和文本的分类,则最好使用概率方法,朴素贝叶斯就可以.在某些情况 ...
- 数据算法 --hadoop/spark数据处理技巧 --(15.查找、统计和列出大图中的所有三角形 16.k-mer计数)
十五.查找.统计和列出大图中的所有三角形 第一步骤的mr: 第二部mr: 找出三角形 第三部:去重 spark: 十六: k-mer计数 spark:
- 数据算法 --hadoop/spark数据处理技巧 --(7.共同好友 8. 使用MR实现推荐引擎)
七,共同好友. 在所有用户对中找出“共同好友”. eg: a b,c,d,g b a,c,d,e map()-> <a,b>,<b,c,d,g> ;< ...
- 哈,我自己翻译的小书,马上就完成了,是讲用python处理大数据框架hadoop,spark的
花了一些时间, 但感觉很值得. Big Data, MapReduce, Hadoop, and Spark with Python Master Big Data Analytics and Dat ...
随机推荐
- Flutter使用SingleTickerProviderStateMixin报错
最近在学习开发Flutter应用项目,在创建tabbar和tabview后,进行网络请求后显示顶部tab标签,设置TabController,并使class类实现SingleTickerProvide ...
- async-await 线程分析
这里没有线程 原文地址:https://blog.stephencleary.com/2013/11/there-is-no-thread.html 前言 我是在看 C#8.0 新特性异步流时在评论里 ...
- C# HttpWebRequest传递参数多种方式混合使用
在做CS调用第三方接口的时候遇到了这样的一个问题,通过PSOTman调试需要分别在parmas.Headers.Body里面同时传递参数.在网上查询了很多资料,以此来记录一下开发脱坑历程. POSTm ...
- 存储过程带参数和sqlcommand
public DataSet SelectBillNo(string CarrierCode, string Date, string CompanyCode) { System.Collection ...
- 关于爬虫的日常复习(18)——scrapy系列3
- python 判断文件的字符编码
import chardet f = open(file='test1.txt', mode='rb') data = f.read() print(chardet.detect(data))
- Python学习,第三课 - 数据类型
前言. 本次针对Python中的数据类型,做详细的总结 1.数字 2 是一个整数的例子. 长整数 不过是大一些的整数. 3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E- ...
- linux下oracle调试小知识
1.oracle 安装下的/u01/diag/rdbms/orcl/HOF/incident目录下是什么文件?答:每当一个错误发生的时候,oracle会创建一个incident,并且分配一个INCID ...
- 讲一下java,c语言,c+和c++都是干嘛的,他们运行的软件都是哪些
讲一下java,c语言,c+和c++都是干嘛的,他们运行的软件都是哪些 都是用于开发软件的,用于不同的方面.比如,淘宝的后台,是java做的.而腾讯的qq的后台服务器,是c和c++的.暴雪游戏的后台服 ...
- 读取sysTreeview32和SysListView32
#include <stdio.h> #include <windows.h> #include <commctrl.h> int main(void) { /* ...