Apache-Spark:map(_._ 2)的简写是什么?

时间:2015-03-25 02:28:15

标签: scala apache-spark

我读了一个项目的源代码,发现:

val sampleMBR = inputMBR.map(_._2).sample

inputMBR是一个元组。

函数map的定义是:

map[U classTag](f:T=>U):RDD[U]

似乎map(_._2)map(x => (x._2))的缩写。

任何人都可以告诉我这些速记的规则吗?

5 个答案:

答案 0 :(得分:16)

_语法可能有点令人困惑。当_本身使用时,它表示匿名函数中的参数。所以如果我们在成对上工作: map(_._2 + _._2)将是map(x, y => x._2 + y._2)的简写。当_用作函数名称(或值名称)的一部分时,它没有特殊含义。在这种情况下,x._2返回元组的第二个元素(假设x是一个元组)。

答案 1 :(得分:11)

collection.map(_._ 2)发出元组的第二个组件。来自纯Scala的示例(Spark RDD以相同的方式工作):

scala> val zipped = (1 to 10).zip('a' to 'j')
zipped: scala.collection.immutable.IndexedSeq[(Int, Char)] = Vector((1,a), (2,b), (3,c), (4,d), (5,e), (6,f), (7,g), (8,h), (9,i), (10,j))

scala> val justLetters = zipped.map(_._2)
justLetters: scala.collection.immutable.IndexedSeq[Char] = Vector(a, b, c, d, e, f, g, h, i, j)

答案 2 :(得分:5)

' _._2'中的两个下划线是不同的。

首先' _'用于匿名函数的占位符;第二个_2'是案例类Tuple成员

类似的东西:

  

案例类Tuple3( _1 :T1, _2 :T2, _3 :T3)   {...}

答案 3 :(得分:0)

我找到了解决方案。

首先underscore此处为占位符

  

为了使函数文字更简洁,您可以使用下划线   作为一个或多个参数的占位符,只要每个参数   在函数文字中只出现一次。

What are all the uses of an underscore in Scala?处详细了解Scala中的underscore

答案 4 :(得分:0)

第一个'_'指的是映射到的内容,因为映射到的是元组,你可以调用元组中的任何函数,其中一个方法是'_2',所以下面告诉我们将输入转换为它的第二个属性。