Top N算法
本期内容:
1、基础Top N 算法
2、分组Top N算法
3、排序算法 RangePartition
Top N(首先实现排序算法,一般否较为复杂),分组Top N 常见的算法。
(只要是改变每一行列的数据,一般都是用Map操作)
/**
* Created by css-kxr on 2016/1/25.
* 基础Top N算法的实现
*/
object TopNBasic {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("SecondarySortApp").setMaster("local") //创建SparkConf,初始化程序的配置
val sc = new SparkContext(conf) //创建SparkContext,这是第一个RDD创建的唯一入口,也是Driver的灵魂,是通往集群的唯一通道
val lines = sc.textFile("C:\\Users\\css-kxr\\Music\\Big_Data_Software\\spark-1.6.0-bin-hadoop2.6\\Hello.txt")
val pairs = lines.map(line =>(line.toInt,line))//生成key,value以方便sortByKey进行排序,因为textFile后得到的是字符串,Int已经实现了排序比较的接口
val sortedByKey = pairs.sortByKey(false)
val sortedData = sortedByKey.map(pair => pair._2).distinct //过滤排序的内容,若需要不同值,可以通过distinct过滤
val top5 = sortedData.take(5) //take到前5个元素,构建成为一个Array,所以不需要用collect,直接foreach
top5.foreach(println)
}
}
RangePartitioner主要是依赖的RDD的数据划分成不同的范围,关键的地方是不同的范围是有许多,
RangePartitioner会产生水塘抽样(适合内存无法容纳数据的情况),除了其为结果数据有序的基石,最为重要的是尽量保证每个Partition中的数据量是均匀的!!!
val sampleSizePerPartition = math.ceil(3.0 * sampleSize / rdd.partitions.size).toInt
乘3的目的保证数据量特别小的分区能够抽取到足够的数据,同时保证数据量特别大的分区能够二次采样。
(Long, Array[(Int, Long, Array[K])]) //<span style="font-family: Helvetica, 'Hiragino Sans GB', 微软雅黑, 'Microsoft YaHei UI', SimSun, SimHei, arial, sans-serif; font-size: 15px; line-height: 24px; widows: auto;">编号、数据数、从RDD采样的数据数组</span>
HashPartitioner弊端是数据倾斜。导致每个分区数据非常不均匀,极端情况下,某个分区拥有RDD的所有数据,集群计算资源不均匀。
跟随王家林老师的零基础讲解,注重动手实战,成为spark高手,笑傲大数据之林!
王家林老师是大数据技术集大成者,中国Spark第一人:
DT大数据梦工厂
新浪微博:www.weibo.com/ilovepains/
微信公众号:DT_Spark
博客:http://.blog.sina.com.cn/ilovepains
TEL:18610086859
Email:18610086859@vip.126.com