1、通配符。类似Java中的*。如:import scala.math._
2、作为一个整体。:_*,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。
3、指代一个集合中的每个元素。例如我们要在一个Array a中筛出偶数,并乘以2,可以用以下办法:a.filter(_%2==0).map(2*_)。
4、在元组中访问组员。如:("scala","spark")._2。
5、某一类型的默认值。如:

var a : Int = _ //a=0
var a : Double = _ //a=0.0
var a : Person = _ //a=null

补充说明:
对于方法中函数作为的占位符,看函数形参决定,例如:

val conf = new SparkConf().setAppName("helloworld").setMaster("local[2]")
val sc = new SparkContext(conf)
val rdd = sc.parallelize(List(("hello", 1), ("hello", 2), ("scala", 1), ("hello", 1), ("world", 1), ("world", 1)))
val rdd1 = rdd.groupBy(_._1)

//原来的用法
// val rdd2 = rdd1.mapValues(_.foldLeft(0)((a: Int, b: (String, Int)) => a + b._2))
//使用占位符的用法
val rdd2 = rdd1.mapValues(_.foldLeft(0)(_+_._2))
// rdd1.mapValues(_.foldLeft(0)(_._2+_)) //错误
// rdd1.mapValues(_.foldLeft(0)(_)) //错误

groupBy方法源码:

abstract class RDD[T: ClassTag](
@transient private var _sc: SparkContext,
@transient private var deps: Seq[Dependency[_]]
) extends Serializable with Logging {
...

def groupBy[K](f: T => K)(implicit kt: ClassTag[K]): RDD[(K, Iterable[T])] = withScope {
groupBy[K](f, defaultPartitioner(this))
}

...
}
由于 f 是单形参:输入参数类型是(String, Int),此时val rdd1 = rdd.groupBy(_._1)中的_代表当前(String, Int),输出类型K由 _._1 确定,即 Int

foldLeft方法源码:

trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {
...
def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this.seq foreach (x => result = op(result, x))
result
}
...
}
op: (B, A) => B中,B已由初始值决定是Int类型,A代表元素本身类型(String, Int)
foldLeft(0)(_+_._2)中,”+”左边的”_“代表当前值op(result, x)中的result,他的类型是Int(B确定)。”+” 右边第一个”_“代表当前元素x(A确定),即(String, Int)类型,所以,要返回Int类型结果,必须取”_._2“。
不能这样用:

rdd1.mapValues(_.foldLeft(0)(_._2+_)) //错误
rdd1.mapValues(_.foldLeft(0)(_)) //错误

参考

https://blog.csdn.net/bingo_liu/article/details/65535694

最新文章

  1. css3动态旋转魔方练习
  2. unix环境高级编程基础知识之第二篇(3)
  3. 【BZOJ 3052】【WC 2013】糖果公园
  4. 【leetcode】3Sum
  5. linux thread 互斥锁
  6. [Windows Phone] 在 Windows Phone 8 控制闪光灯
  7. java Double保留小数点位数
  8. Robot framework(RF) 用户关键字
  9. bash: scrapy: command not found
  10. [Leetcode]643. Maximum Average Subarray I
  11. 微信小程序分享朋友圈
  12. [转] Shader Blending
  13. 【Python语言】Python介绍
  14. 基于R语言的ARIMA模型
  15. rails 杂记 - model 中的exists?
  16. [leetcode]95. Unique Binary Search Trees II给定节点形成不同BST的集合
  17. 在vue配置sass
  18. wpf之WrapPanel与StackPanel
  19. MVC001之权限校验
  20. D. Mahmoud and Ehab and the binary string Codeforces Round #435 (Div. 2)

热门文章

  1. luoguP1871 对撞机【赛后第一题
  2. typescript与nodejs(二)基于装饰器实现路由表
  3. Java之通过接口获取数据并用JDBC存储到数据库中
  4. Vue 从入门到进阶之路(十四)
  5. Geohash精度和原理
  6. extjs 动态加载列表,优化思路
  7. 松软科技web课堂:JavaScript 注释
  8. 对cookie-parser的理解(签名、加密)
  9. 从零开始的SpringBoot项目搭建
  10. SQL Prompt提示和SQL默认智能提示冲突解决