遇到复杂逻辑的时候,如果hivesql 或者sparksql中的自带的函数无法满足你的需求,这时候使用udf能很快的解决你的问题。
方法一、使用scala写一个函数,通过sparksql 注册这个函数。
//比如我在spark 代码中定义了一个函数
val f:Int=>Int = (x:Int) =>{ 2*x}
//使用udf之前,先注册
sparkSession.udf.register("pro_text2", f)
//在spark sql 中使用
val aa:Dataframe=sparksession.sql(
s"""
select
b.userId
,b.orderId
,b.orderNo
,pro_text2(b.id) as f_id
from test
"""
)
(上面是我手动打的,没使用idea编辑),就是在编写spark代码时,使用scala语言顶一个函数;然后通过sparkSession 去注册它,给它命名,在sparksql中就可以使用它了。
方法二、使用java写udf(这个对于熟悉java的人来说,特别友好,面对特别复杂的逻辑,使用scala没感觉的可以使用该方法。)
1.首先创建一个类class,去实现UDF1或者UDF2或UDF3....(如果你sql中需要输入一个参数就实现UDF1;2个参数就实现UDF2,依次类推)
public class TeachOrderUdf implements UDF1{ @Override public Int call(Int a) throws Exception { return a*2; } }
上面UDF1
2.注册,并使用
//注册
sparkSession.udf register("pro_text", new TeachOrderUdf(), DataTypes.StringType)
//在spark sql 中使用
val aa:Dataframe=sparksession.sql(
s"""
select
b.userId
,b.orderId
,b.orderNo
,pro_text(b.id) as f_id
from test
"""
)
方法三、直接使用scala写一个udf
val pro_text3=udf((x:Int)=>{
x*3
})



