【问题标题】:Putting two placeholders inside flatMap in Spark Scala to create Array在 Spark Scala 中将两个占位符放在 flatMap 中以创建数组
【发布时间】:2015-08-18 02:01:06
【问题描述】:

我在一个 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

但我试图在代码的第二行中使用placeholder "_",我通过以下方式创建y

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 apache-spark placeholder flatmap


    【解决方案1】:

    在 scala 中,lambda 中占位符的数量表示 lambda 参数的基数。

    所以最后一行扩展为

    val y = x.flatMap((x1, x2) => Array(x1, x2*100, 42))
    

    长话短说,您不能使用占位符来两次引用同一个元素。

    在这种情况下你必须使用命名参数。

    val y = x.flatMap(x => Array(x, x*100, 42))
    

    【讨论】:

      【解决方案2】:

      每个参数只能使用一次 _ 占位符。 (在您的情况下,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) }
      

      应该也可以工作(并且可能更具可读性)

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2014-09-29
        • 2018-04-23
        • 2018-11-29
        • 1970-01-01
        • 2018-02-11
        • 1970-01-01
        相关资源
        最近更新 更多