Scala 它不在范围内解析
我有一些scala/spark代码,如下所示:Scala 它不在范围内解析,scala,apache-spark,implicit,Scala,Apache Spark,Implicit,我有一些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"
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.\u
,方法===
停止解析value===不是org.apache.spark.sql.Dataset的成员
因此,出于某种原因,导入sqlContext.implicits.\u
在传递函数参数时不起作用。我的问题是:
为什么隐式导入停止工作
我该怎么做才能使导入工作并且仍然使用函数参数
大多数情况下,问题不在于隐式,而在于类型不匹配(隐式对类型非常敏感)
Unit
在a(Unit)
中,抽象类Unit的b(Unit)
。它没有类型Unit
(它有类型Unit.type
)。它是()
类型为单位的
a(单位)
,b(单位)
编译只是因为在Scala中任何类型(例如Unit.type
)都可以转换为Unit
您也不能编写a(“prop_a1”)
,b(“prob_b1”)
,因为a
,b
是来自单元的函数,您不能将它们应用于字符串
所以尽管
val join: (Unit => Dataset[MyCaseClassA], Unit => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
a(Unit).joinWith(b(Unit),
a(Unit)("prop_a1") === b(Unit)("prob_b1"),
"left"
) //more code...
编译(同理)
val join: (Unit => Dataset[MyCaseClassA], Unit => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
a(1).joinWith(b("A"),
a(true)("prop_a1") === b(???)("prob_b1"),
"left"
) //more code...
会编译)看起来你真的是想
val join: (Unit => Dataset[MyCaseClassA], Unit => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
a(()).joinWith(b(()),
a(())("prop_a1") === b(())("prob_b1"),
"left"
) //more code...
接受Unit
也有点奇怪,通常返回Unit
你可以写
val join: (() => Dataset[MyCaseClassA], () => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
a().joinWith(b(),
a()("prop_a1") === b()("prob_b1"),
"left"
) //more code...
这里,()=>…
akaFunction0[…]
是无参数函数的类型
或者你可以用参数来写
val join: (=> Dataset[MyCaseClassA], => Dataset[MyCaseClassB]) => Dataset[AB] = (a, b) =>
a.joinWith(b,
a("prop_a1") === b("prob_b1"),
"left"
) //more code...