我在火花地图功能中使用下划线参数或命名参数时看到了一些区别。
看看这段代码(在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
我得到的非工作线的例外是:
错误:无法找到存储在a中的类型的编码器 数据集。原始类型(Int,String等)和产品类型(案例 通过导入spark.implicits._支持 序列化其他类型将在未来版本中添加。
答案 0 :(得分:5)
那是因为扩展:
ds.map(Array("funk", "" + _)).collect
不按你的想法工作。它扩展到:
ds.map(Array("funk", ((x: Any) => "" + x))).collect
数组创建中的_
扩展为函数。根据DataSet的文档,不支持函数。
如果我们采取最小的重现:
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)
是否在数组创建中发生了扩展。