【问题标题】:scala underscore parameter not acting as named parameter, in spark map reducescala下划线参数不作为命名参数,在火花映射减少
【发布时间】:2017-11-16 11:35:17
【问题描述】:

我发现在 spark map 函数中使用下划线参数或命名参数时有些不同。

看看这段代码(在 spark-shell 中执行):

var ds = Seq(1,2,3).toDS()
ds.map(t => Array("something", "" + t)).collect // works cool
ds.map(Array("funk", "" + _)).collect // doesn't work

我得到的不工作行的例外是:

错误:无法找到存储在 数据集。原始类型(Int、String 等)和产品类型(案例 类)通过导入 spark.implicits._ 支持 序列化其他类型将在以后的版本中添加。

【问题讨论】:

    标签: scala apache-spark lambda encoder


    【解决方案1】:

    那是因为:

    ds.map(Array("funk", "" + _)).collect 
    

    不像你想象的那样工作。它扩展为:

    ds.map(Array("funk", ((x: Any) => "" + x))).collect 
    

    您的数组创建中的_ 扩展为一个函数。根据DataSets的文档,不支持函数。

    如果我们进行最小复制:

    val l = List(1,2,3)
    val res = l.map(Array("42", "" + _))
    

    并查看typer扩展(scalac -Xprint:typer),可以看到:

    def main(args: Array[String]): Unit = {
      val l: List[Int] = scala.collection.immutable.List.apply[Int](1, 2, 3);
      val res: List[Object] = 
        l.map[Object, List[Object]]
        (scala.Predef.wrapRefArray[Object]
          (scala.Array.apply[Object]("42", ((x$1: Any) => "".+(x$1))
    

    如果我们隔离具体的相关部分,我们可以看到:

    (x$1: Any) => "".+(x$1)
    

    是在数组创建内部发生的扩展。

    【讨论】:

    • @Alexey 谢谢!固定。
    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2011-11-29
    • 2014-08-10
    • 2019-03-26
    相关资源
    最近更新 更多