栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

spark sql 写udf 几种方式总结及遇到的问题

spark sql 写udf 几种方式总结及遇到的问题

遇到复杂逻辑的时候,如果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   第一个Int表示你输入的参数,即你sql中要传入的字段或者数据,最后一个Int表示调用UDF方法后返回的数据类型,即return 的类型。

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
    
  })

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/745653.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号