Spark常用算子-action

spark action常用算子类型如下:
1.collectAsMap(): Map[K, V]:二元组RDD转为Map数据类型
countByKey(): Map[K, Long]:统计RDD中每个key出现的次数,还回Map类型表示每个key出现了几次
countByValue(): Map[T, Long]:统计RDD中每个元素出现的次数,还回Map类型表示每个元素出现了几次

val rdd2: RDD[(String, Int)] = sc.parallelize(List(("a", 21), ("b", 2), ("c", 3), ("a", 3), ("d", 21), ("e", 21)), 2)
// action: collectAsMap
val kv: Map[String, Int] = rdd2.collectAsMap()
println(kv)
// countByKey
val keyCount = rdd2.countByKey()
println(keyCount)
// countByValue
val valueCount = rdd2.countByValue()
println(valueCount)

/**
Map(e -> 21, b -> 2, d -> 21, a -> 3, c -> 3)
Map(e -> 1, a -> 2, b -> 1, c -> 1, d -> 1)
Map((c,3) -> 1, (b,2) -> 1, (e,21) -> 1, (a,3) -> 1, (a,21) -> 1, (d,21) -> 1)
*/

2.foreach(f: T => Unit): Unit:循环遍历RDD中每一个元素
foreachPartition(f: Iterator[T] => Unit): Unit:该算子与foreach算子类似,遍历处理元素数据时可共享分区内资源,当需要额外对象数据时foreachPartition算子比foreach效率高。

val rdd = sc.parallelize(List(1, 2, 3, 4, 5, 6), 2)
rdd.foreach(println(_))
rdd.foreachPartition { iterator =>
    val value = { //外连接资源 }
    println(value+iterator.reduce(_*_))
}

3.aggregate [U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U:算子中参数zeroValue是初始值;seqOp是分区内Task的执行逻辑,在分区内zeroValue与第一个元素按业务逻辑聚集再依次与剩余元素聚集,还回与zeroValue同样数据类型;combOp是聚集各分区的业务逻辑操作,起始也是由zeroValue与第一个分区聚集结果按业务逻辑聚集,再依次与剩余分区聚集结果依次聚集,输入与输出数据类型都与zeroValue一致。

  /**
    * 分区内初始值zeroValue与每个元素依次聚集
    *
    * @param zeroValue
    * @param value
    * @return
    */
  def seqOp(zeroValue: ArrayBuffer[Int], value: Int): ArrayBuffer[Int] = {
    println("zeroValue:" + zeroValue + "\tvalue:" + value)
    zeroValue += value
  }

  /**
    * 各个分区聚集后的结果再依次聚集
    *
    * @param a
    * @param b
    * @return
    */
  def combOp(a: ArrayBuffer[Int], b: ArrayBuffer[Int]): ArrayBuffer[Int] = {
    println("a:" + a + "\tb:" + b)
    a ++ b
  }
val rdd = sc.parallelize(List(1, 2, 3, 4, 5, 6), 2)
val result = rdd.aggregate(ArrayBuffer[Int](88))(seqOp, combOp)
println("------------------------------------")
println(result)

/**
结果如下:
zeroValue:ArrayBuffer(88)	value:1
zeroValue:ArrayBuffer(88, 1)	value:2
zeroValue:ArrayBuffer(88, 1, 2)	value:3
zeroValue:ArrayBuffer(88)	value:4
zeroValue:ArrayBuffer(88, 4)	value:5
zeroValue:ArrayBuffer(88, 4, 5)	value:6
a:ArrayBuffer(88)	b:ArrayBuffer(88, 1, 2, 3)
a:ArrayBuffer(88, 88, 1, 2, 3)	b:ArrayBuffer(88, 4, 5, 6)
------------------------------------
ArrayBuffer(88, 88, 1, 2, 3, 88, 4, 5, 6)
说明:zeroValue先在每个分区与元素依次聚集,zeroValue再与各个分区结果依次聚集,故2个分区结果有3个88
*/

 

未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值