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

[转]scala和RDD中的占位符"_"的更多相关文章

  1. Scala 基础(8)—— 占位符_和部分应用函数

    1. 占位符 _ 针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可以使用占位符 _ 来代替. 占位符_,用来表示一个或者多个参数.(这 ...

  2. Java C# C语言中的占位符

    一般拼接一段字符串在编程中是很常见的事,下面简单做个总结: 什么是占位符?占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号. 1.Java中处理方法: package com.amos; ...

  3. 安卓编程资源文件string中对占位符的使用详解

    这里将为你详细介绍占位符的使用,将其学以致用,可以达到简化布局文件,减少字符串资源量. 1.在资源文件中的使用. 打开资源文件中的strings.xml文件,进行编辑.如下图所示: 图  1.0 2. ...

  4. 【占位符替换】替换String中的占位符标志位{placeholder}

    概述 占位符替换, 占位符表示为:{placeholder}; 示例:替换如下{xxx}占位符中的内容 "名字:{name},年龄:{age},学校:{school}" 提供了两种 ...

  5. Java替换字符串中的占位符

    在开发中,会有动态配置字符串其中的某些字符,如何使用字符中的占位符,并且在代码动态替换占位符实现动态配置字符串! 1.定义字符串时,再string文件添加字符串: 注意!记得要在字符文件中加上这些: ...

  6. scala学习笔记(4):占位符

    scala 中占位符的用法 1.作为“通配符”,类似Java中的*.如import scala.math._ 2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = s ...

  7. scala占位符_的用法

    占位符的用途颇多,先介绍几种常用的用法 1.作为"通配符",类似Java中的*.如import scala.math._2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序 ...

  8. hibernate查询语句hql中的占位符?参数与命名参数:name设值方式搞混

    先贴出异常 Struts has detected an unhandled exception: Messages: Position beyond number of declared ordin ...

  9. C# 中的占位符本质

    占位符本质 1.占位符是相对于String字符串类型而言的. 2.占位符其实就是调用String.Format()方法.把指定的变量拼接到定义好的字符串模板中组成新的字符串.

随机推荐

  1. mysql 事务四要素杂谈

    事务四要素 对于数据库来说,并发性和准确性是数据库需要权衡的两个点. 类似于我们的应用系统,又要要性能还要要准确. 数据准确性这一条来说,最好的控制就是串行化,都别急,一个一个来.这样数据就没问题了. ...

  2. 使用ES6新特性async await进行异步处理

    我们往往在项目中会遇到这样的业务需求,就是首先先进行一个ajax请求,然后再进行下一个ajax请求,而下一个请求需要使用上一个请求得到的数据,请求少了还好说,如果多了,就要一层一层的嵌套,就好像有点c ...

  3. @Import与@ImportResource注解的解读

    前言 在使用Spring-Cloud微服务框架的时候,对于@Import和@ImportResource这两个注解想必大家并不陌生.我们会经常用@Import来导入配置类或者导入一个带有@Compon ...

  4. IconFont使用注意点

    在工作中,我经常会用阿里的IconFont图标库,今天发现一个之前没怎么注意到的问题. 首先IconFont给我们提供了三种引用图标的方式 unicode引用 unicode是字体在网页端最原始的应用 ...

  5. 工作笔记 之 Python应用技术

    python socket编程详细介绍 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,建立网络通信连接至少要一对端口号(socket). Socket本质是 ...

  6. [Vue warn]: Invalid prop: type check failed for prop "fullscreen"

    fullscreen属性是Dialog弹窗中定义是否为全屏 Dialog的属性,element 官方文档中默认值是false ,于是加入是对其赋值 true,然后报了下面的错误: 解决办法:实际上并不 ...

  7. Java题库——chapter7 多维数组

    1)Which of the following statements are correct? 1) _______ A)char[ ][ ] charArray = {{'a', 'b'}, {' ...

  8. ZooKeeper(六):watch机制的原理与实现

    因为ZK有watch机制,可以随时发现一些数据的变化,从而达到数据的及时性. ZK的所有读操作都可以设置watch监视点: getData, getChildren, exists. 写操作则是不能设 ...

  9. selenium自动化测试爬取动态页面大全

    目录 一:浏览器信息测试 二:查找结点 三:测试动作 四:获取节点信息 五:切换子页面Frame 六,延时请求 七:前进和后退 八:Cookies 八:选项卡处理 九:捕获异常   这里之讲解用法,安 ...

  10. 【转载】Android Studio Service AIDL 详解

    公司产品之前IM这块存在很多问题,消息到达率低,加上协议上有些问题,丢消息频繁,所以需要重构IM,AIDL不能解决以上问题.好吧!那AIDL可以解决什么问题?什么是AIDL? 什么是AIDL? AID ...