如何使用 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
如何使用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