错误信息确实有点误导; 原因是该函数udf
采用隐式参数列表,但您传递的是实际参数.因为我不知道很多关于火花,并且由于udf
签名是有点令人费解,我会尽力解释是怎么回事,有一个简单的例子.
实际上udf
是一个给出一些显式参数的函数,一个隐式参数列表给你另一个函数; 让我们来定义给出下面的函数pivot
型T
的,我们有一个隐含Ordering
会给作为一个函数,使我们能够一分为二的序列,包含小于元素一个pivot
,另一个包含元素是更大:
def buildFn[T](pivot: T)(implicit ev: Ordering[T]): Seq[T] => (Seq[T], Seq[T]) = ???
让我们省略实施,因为它并不重要.现在,如果我执行以下操作:
val elements: Seq[Int] = ??? val (small, big) = buildFn(10)(elements)
我将犯你在代码中显示的同样的错误,即编译器会认为我显式传递elements
为隐式参数列表,这将无法编译.我的示例的错误消息将与您拥有的错误消息有所不同,因为在我的情况下,我错误地传递给隐式参数列表的参数数量与预期参数列表匹配,然后错误将是关于不排队的类型.
相反,如果我把它写成:
val elements: Seq[Int] = ??? val fn = buildFn(10) val (small, big) = fn(elements)
在这种情况下,编译器将正确地将隐式参数传递给函数.我不知道有什么办法可以绕过这个问题,除非你想明确地传递实际的隐含参数,但我觉得它很难看并且并不总是实用的; 作为参考,这就是我的意思:
val elements: Seq[Int] = ??? val (small, big) = buildFn(10)(implicitly[Ordering[Int]])(elements)