将两个占位符放在 Spark Scala 中的 flatMap 中以创建数组
Putting two placeholders inside flatMap in Spark Scala to create Array
我在 Scala 数组上应用 flatMap
并从中创建另一个数组:
val x = sc.parallelize(Array(1,2,3,4,5,6,7))
val y = x.flatMap(n => Array(n,n*100,42))
println(y.collect().mkString(","))
1,100,42,2,200,42,3,300,42,4,400,42,5,500,42,6,600,42,7,700,42
但我试图在我创建 y
的代码的第二行中使用 placeholder "_"
,方法如下:
scala> val y = x.flatMap(Array(_,_*100,42))
<console>:26: error: wrong number of parameters; expected = 1
val y = x.flatMap(Array(_,_*100,42))
^
这是行不通的。如果我想使用占位符,有人可以解释在这种情况下该怎么做吗?
在 scala 中,lambda 中占位符的数量表示 lambda 参数的基数。
所以最后一行展开为
val y = x.flatMap((x1, x2) => Array(x1, x2*100, 42))
长话短说,您不能使用占位符两次引用同一元素。
在这种情况下,您必须使用命名参数。
val y = x.flatMap(x => Array(x, x*100, 42))
每个参数只能使用一次 _ 占位符。 (在你的例子中,flatMap 方法采用单个参数,但你是说——嘿编译器,期待两个参数是行不通的)
val y = x.flatMap(i => Array(i._1, i._2*100,42))
应该可以解决问题。
val y = x.flatMap { case (i1, i2) => Array(i1, i2*100,42) }
应该也可以工作(并且可能更具可读性)
我在 Scala 数组上应用 flatMap
并从中创建另一个数组:
val x = sc.parallelize(Array(1,2,3,4,5,6,7))
val y = x.flatMap(n => Array(n,n*100,42))
println(y.collect().mkString(","))
1,100,42,2,200,42,3,300,42,4,400,42,5,500,42,6,600,42,7,700,42
但我试图在我创建 y
的代码的第二行中使用 placeholder "_"
,方法如下:
scala> val y = x.flatMap(Array(_,_*100,42))
<console>:26: error: wrong number of parameters; expected = 1
val y = x.flatMap(Array(_,_*100,42))
^
这是行不通的。如果我想使用占位符,有人可以解释在这种情况下该怎么做吗?
在 scala 中,lambda 中占位符的数量表示 lambda 参数的基数。
所以最后一行展开为
val y = x.flatMap((x1, x2) => Array(x1, x2*100, 42))
长话短说,您不能使用占位符两次引用同一元素。
在这种情况下,您必须使用命名参数。
val y = x.flatMap(x => Array(x, x*100, 42))
每个参数只能使用一次 _ 占位符。 (在你的例子中,flatMap 方法采用单个参数,但你是说——嘿编译器,期待两个参数是行不通的)
val y = x.flatMap(i => Array(i._1, i._2*100,42))
应该可以解决问题。
val y = x.flatMap { case (i1, i2) => Array(i1, i2*100,42) }
应该也可以工作(并且可能更具可读性)