SparkCore之RDD算子Action

  /**
    * 1、collect
    * 1)返回 Array(ele)
    * 2)實現方法:遍歷添加到數組
    * 3)需要注意的是因爲該方法是把所有的數據放到內存,所以不適合大量數據==>否則OOM
    *
    * 2、take
    * 前n個元素
    * collect vs take =====>
    * collect 是直接計算所有結果,把每個partition的結果變成array,再合併成一個array
    * take 會先計算1個partition,然後根據結果的的數量推斷還需要計算幾個分區,計算這幾個分區
    * 看結果夠不夠,不夠再迭代。
    *
    * 3、count:返回元素個數
    * 4、first:返回第一個元素,調用take(1)
    * 5、top:
    * 返回largest的前n個元素
    * 底層調用Ordering排序
    * OOM
    * 6、takeOrdered:返回最小的前n個元素
    * 7、reduce 兩兩操作
    * 8、foreach、foreachPartition 遍歷
    * 9、countByKey
    * 統計key,用於數據傾斜統計key的數量
    * 實現:mapValues(_=>1L).reduceByKey(_+_).collect
    * 10、countByValue:統計相同元素的個數
    * 看名字還以爲是對KV類型RDD按Value統計
    * 實際測試,是統計相同元素個數
    * List(("a",1),("b",2),("c",1))==countByValue==>Map(("a",1)->1,("b",2)->1,("c",1)->1)
    * 我們再看下源碼: 調用的是 RDD下的map(value => (value, null)).countByKey()
    * 從源碼來看
    * 1)RDD說明不僅僅只能用於PairRDD
    * 2) map(value=>(value,null))確實是對整個元素操作
    * 3) 如果按我們想的應該是調用PairRDD,實現map(value => (value._2, 1L)).countByKey()
    *
    * @param sc
    */
  def actionTest(sc: SparkContext): Unit = {
    val rdd = sc.parallelize(List(1, 2, 3))

    //返回包含所有元素的Array
    rdd.collect()
    //前n個元素
    rdd.take(2)
    //元素個數
    //實現遍歷累加計數器
    rdd.count()
    //第一個元素,調用take(1)
    rdd.first()
    //返回最大的(largest 排序)前n個元素,底層有調用
    //放到內存,適合小數據==>oom
    rdd.top(-1)
    rdd.top(1)(Ordering.by(x => -x)) //針對數值類型,升序方式
    //返回小的,升序
    rdd.takeOrdered(2)
    //兩兩相加
    rdd.reduce(_ + _)
    rdd.foreach(println(_)) //遍歷元素
    rdd.foreachPartition(partition => { //遍歷分區
      partition.foreach(println(_))
    })
    rdd.countByValue() // map(v=>(v,null)).countByKey
    rdd.map((_, 2)).countByKey() // mapValues(x=>1L).reduceByKey(_+_).collect
    //rdd.map((_,1)).mapValues(_+2)

    //對文件來說,textFile讀進來一行作爲一個元素(map),因此count=line
    sc.textFile("file:///opt/mydata/olddata/data1.txt").count()

    rdd.sum()
    rdd.max()
    rdd.min()

  }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章