/**
* 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()
}