Action算子是spark作业执行的动因,也就是说transformation要想执行,就需要action去触发,通常就将RDD的数据输出到外部的存储介质,或者返回给Driver。
Foreach
//执行action操作
// rbk.foreach()
//遍历该rdd中的每一条记录,该操作是在executor中的partition上面完成
/**
* 将rdd的数从executor中拉取到driver端进行操作(全量数据的拉取)
* 需要注意的是:执行collect操作,可能存在OOM的异常风险
* 如果我们要想将数据从rdd中拉取到dirver中
* 要么先filter,过滤一部分数据,再拉取,要么执行其他操作,比如take,first,takeOrdered
* TopN
* 如果该RDD数据是有序的,使用take(N)---->TopN
*/
*/
//将rdd的数据从executor中拉去到driver端进行操作
val results:Array[(String, Int)] = rbk.collect()
for (elem <- results) {
println(elem)
}
Take
println("-------------take---------------")
/**
* 如果我们要想将数据从rdd中拉取到dirver中
* 要么先filter,过滤一部分数据,再拉取,要么执行其他操作,比如take,first,takeOrdered
* TopN
* 如果该RDD数据是有序的,使用take(N)---->TopN
*/
val takes:Array[(String, Int)] = rbk.take(2)
for(t <- takes) {
println(t)
}
TakeOrdered
println("-------------takeOrdered---------------")
/**
* 获取的通过排序,找到前N个值
* 按照的次数的降序排列
*/
//隐式转换参数
implicit val ord = new Ordering[(String, Int)](){
/**
* 升序,就是前面的比后面
* 降序,就是后面的比前面
*/
override def compare(x: (String, Int), y: (String, Int)) = {
y._2.compareTo(x._2)
}
}
//这里会调用上面的隐式转换参数
val orders:Array[(String, Int)] = rbk.takeOrdered(2)
显示传递方式:
val orders:Array[(String, Int)] = rbk.takeOrdered(2)(new Ordering[(String, Int)](){
/**
* 升序,就是前面的比后面
* 降序,就是后面的比前面
*/
override def compare(x: (String, Int), y: (String, Int)) = {
y._2.compareTo(x._2)
}
})