我有一些scala/spark代码如下:
import sqlContext.implicits._
val join: (Dataset[MyCaseClassA], Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
a.joinWith(b,
a("prop_a1") === b("prob_b1"),
"left"
) //more code...
这工作很好,编译和一切。但是假设我想做一些函数式编程,所以我将整个过程重构为:
import sqlContext.implicits._
val join: (Unit => Dataset[MyCaseClassA], Unit => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
a(Unit).joinWith(b(Unit),
a("prop_a1") === b("prob_b1"),
"left"
) //more code...
好吧,这样就可以了。然而,最终的结果是intellij会立即变灰 import sqlContext.implicits._
,以及方法 ===
停止解析 value === is not a member of org.apache.spark.sql.Dataset
.
所以出于某种原因 import sqlContext.implicits._
只是在传递函数参数时不起作用。我的问题是:
为什么隐式导入停止工作?
我该怎么做才能使导入工作并且仍然使用函数参数?
1条答案
按热度按时间ifmq2ha21#
最重要的不是隐式,而是类型不匹配(隐式对类型非常敏感)。
Unit
在a(Unit)
,b(Unit)
是抽象类的伴生对象Unit
. 它没有类型Unit
(它有类型Unit.type
). 是的()
有类型的Unit
.a(Unit)
,b(Unit)
编译只是因为在scala中任何类型(例如。Unit.type
)可以转化为Unit
.你也不会写字
a("prop_a1")
,b("prob_b1")
因为a
,b
函数来自Unit
,您不能将它们应用于String
.所以尽管
编译(类似偶数)
你的意思是
也有点奇怪接受
Unit
,通常Unit
已返回。你可以写
在这里
() => ...
又称作Function0[...]
是无参数函数的类型。或者可以使用按名称参数编写