我有一个名为getAge(timestamp:Long)的方法,我想将其注册为sql函数。
我有
sqlContext.udf.register("getAge",getAge)
但它告诉我我需要参数或之后使用_,我尝试使用_但是给了我错误。我如何用参数注册它。我是scala的新手,所以我不知道该怎么做。
答案 0 :(得分:14)
sqlContext.udf.register("getAge",getAge)
应该是:
sqlContext.udf.register("getAge",getAge _)
下划线(函数和下划线之间必须有空格)将函数转换为可在注册中传递的部分应用函数。
当我们调用一个函数时,我们必须传入所有必需的参数。如果我们不这样做,编译器会抱怨。
然而,我们可以要求它将该函数作为一个值,我们可以在以后传递所需的参数。我们如何做到这一点就是使用下划线。
getAge
表示运行getAge
- 例如def getAge = 10
给我们10
。我们不想要结果,我们想要这个功能。此外,根据您的定义,编译器会发现getAge
需要一个参数,并抱怨没有给出参数。
我们在这里要做的是将getAge
作为函数值传递。我们告诉Scala,我们还不知道参数,我们希望函数作为一个值,我们将在以后为它提供所需的参数。所以,我们使用getAge _
。
假设getAge
的签名是:
getAge(l: Long): Long = <function>
getAge _
成为匿名函数:
Long => Long = <function>
表示它需要Long
类型的参数,调用它的结果将产生类型为Long
的值。