天天看點

Top N 算法

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]

繼續閱讀