如何使用 Spark Session 在 Spark2 中重载 UDF

How to overload UDFs in Spark2 using Spark Session

如何使用Spark Session在Spark2中实现方法重载UDF

scala> spark.udf.register("func",(a:String)=>a.length)   

scala> spark.udf.register("func",(a:Int)=>a*1000)

以下是名为 'orc' 的我的 Hive table 及其描述

scala> spark.sql("desc orc").collect.foreach(println)
[id,int,null]
[name,string,null]
[time_stamp,timestamp,null]

我的有两条记录table

scala> spark.sql("select * from orc").collect.foreach(println)
[1,Pratap Chandra Dhan,null]
[2,Dyuti Ranjan Nayak,2016-01-01 00:00:00.0]

当我使用spark session查询时,第二个函数生效,防止方法重载

scala> spark.sql("select func(id),func(name) from  orc").collect.foreach(println)
[1000,null]
[2000,null]

如果确实需要(参考评论),您可以定义func来处理多种类型的输入,如下所示并注册:

scala> val func = (a: Any) => {
     |       val i = a match {
     |       case s:String => s.length
     |       case d:Integer => d * 1000
     |       //case _ => 0
     |       }
     |       i
     |       }
func: Any => Int = <function1>

scala> spark.udf.register("func",func)

函数重载有效当同名函数的作用域被定义为具有不同的作用域,即在class或目的。

当您在函数内部定义函数时,函数重载不起作用。最新定义接管,即被最新定义覆盖。

例如

我定义了两个不同类型的函数func作为参数

scala> def func(a:String) = a.length
func: (a: String)Int

scala> def func(a: Int) = a*2
func: (a: Int)Int    

那我尝试调用第一个定义

scala> func("sell")
<console>:13: error: type mismatch;
 found   : String("sell")
 required: Int
       func("sell")
            ^                                                                                                                                                                                                                                                                                                                      

如果我调用第二个定义(最新的),它会起作用

scala> func(3)
res1: Int = 6

我重新定义了第一个定义,即最新的又是第一个定义

scala> def func(a:String) = a.length
func: (a: String)Int

现在第一个函数调用有效

scala> func("sell")
res2: Int = 4

函数重载在普通 REPL 中不起作用。您将必须输入 :粘贴模式

scala> :paste
// Entering paste mode (ctrl-D to finish)

def func(a:String) = a.length
def func(a: Int) = a*2

// Exiting paste mode, now interpreting.

func: (a: String)Int <and> (a: Int)Int
func: (a: String)Int <and> (a: Int)Int

scala> func("sell")
res0: Int = 4

scala> func(3)
res1: Int = 6