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:[email protected]