rdd,scala中的占位符“_”
2017-03-24 01:49
211 查看
1、通配符。类似Java中的*。如:
2、作为一个整体。
3、指代一个集合中的每个元素。例如我们要在一个Array a中筛出偶数,并乘以2,可以用以下办法:
4、在元组中访问组员。如:
5、某一类型的默认值。如:
补充说明:
对于方法中函数作为的占位符,看函数形参决定,例如:
groupBy方法源码:
由于 f 是单形参:输入参数类型是(String, Int),此时
foldLeft方法源码:
op: (B, A) => B中,B已由初始值决定是Int类型,A代表元素本身类型(String, Int)
不能这样用:
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)(_)) //错误
相关文章推荐
- Scala基础—集合函数式编程示例(占位符的使用示例)
- 大数据IMF传奇行动绝密课程第60课:使用Java和Scala在IDE中实战RDD和DataFrame动态转换操作
- RDD.scala(源码)
- Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)
- scala-1.RDD常见算子
- scala学习-Description Resource Path Location Type value toDF is not a member of org.apache.spark.rdd.R
- 使用Java和Scala在IDE中实战RDD和DataFrame动态转换操作
- Scala 将CSV文件转为RDD
- Java和scala实现 Spark RDD转换成DataFrame的两种方法小结
- 第59课:使用Java和Scala在IDE中实战RDD和DataFrame转换操作’学习笔记
- spark2.x由浅入深深到底系列六之RDD java api调用scala api的原理
- scala占位符_的用法
- [置顶] spark常用RDD算子 汇总(java和scala版本)
- Spark RDD编程(Python和Scala版本)
- 第60课:使用Java和Scala在IDE中实战RDD和DataFrame动态转换操作学习笔记
- RDD和DataFrame转换(Java+Scala)
- RDDTest.scala
- Spark-Scala-RDD 入门问题汇总
- 利用JAVA、SCALA实现RDD和DataFrame转换
- spark scala 对RDD进行过滤----filter使用方法