如何在scala中向sqlContext UDF注册函数?

时间:2015-07-07 19:54:52

标签: scala apache-spark apache-spark-sql

我有一个名为getAge(timestamp:Long)的方法,我想将其注册为sql函数。

我有

sqlContext.udf.register("getAge",getAge) 

但它告诉我我需要参数或之后使用_,我尝试使用_但是给了我错误。我如何用参数注册它。我是scala的新手,所以我不知道该怎么做。

1 个答案:

答案 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的值。

相关问题