spark 动态UDF加载实现

背景

   在vivo推荐算法业务中,需要使用SparkSql,对存储在hive的离线数据进行处理,制作用户特征,然后入库到redis,我们做了一套离线特征入库的sql化的系统,可以将用户需要入库的特征,通过sql提取出来,选取对应的入库特征类型、引擎即可入库特征,实现自动化入库离线特征的效果
   但是业务往往需要一些个性化的数据处理,平台不能全部注册好用户需要的方法,所以我们做了一套udf、jar管理系统,用户启动任务后,动态的去加载用户jar来实现自定义UDF的逻辑,下面是具体做法

具体思路

   通过调研之后,我决定使用spark的函数注册接口  spark.udf.register,分别构造函数名称、UDF1(这里目前只需要输入参数为一种的业务,所以不用去实现UDF2....等)、返回类型  returnType 
   具体方法参数 (name:String,f:UDF1[_,_],returnType:DataType),你可以自行查看
   找到注册函数,一切都好办了,我只需要动态的加载用户的jar里面的udf,通过反射去构造UDF1即可实现函数注册,**这里需要注意的是UDF1实现的时候必须实现序列化,否则就会报序列化错误**

其中加载jar、识别输入、输出、方法体、构造UDF1使用如下代码

val url=newURL("file:xxx")
valurls=Array(url)
var myClassLoader:URLClassLoader=newURLClassLoader(urls,scala.reflect.runtime.universe.getClass.getClassLoader)
varIType=method.getParameterTypes.map(JavaTypeInference.inferDataType).map(_._1).head
valiputType=method.getParameterTypes.head.getName
varRtype=JavaTypeInference.inferDataType(method.getReturnType)._1
val zz = myClassLoader.loadClass(className)
case class TempUDF() extends UDF1[Object,Any] with Serializable{
        override def call(v1: Object): Any = {
          val m1 = zz.getDeclaredMethods.filter(_.getName.equals(methodName)).head
          m1.invoke(zz.newInstance(), v1)
        }
      }

不知道是因为公司安全问题,还是csdn问题,全部的内容,我写到简书了,有需要的自行查看
简书地址(https://www.jianshu.com/p/efff975b714f)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark中的UDAF是指用户自定义聚合函数(User-Defined Aggregate Function)。UDAF允许我们根据自己的业务需求定义一种聚合函数,以便在Spark中进行数据聚合操作。 UDAF有两个主要的使用方式: 1. 在DataFrame中使用UDAF:可以通过在DataFrame中注册UDAF函数来使用UDAF。首先从HDFS中加载数据到DataFrame中,然后注册UDAF函数,比如将所有名字变成大写的UDF函数,接下来创建临时视图,并执行注册的函数来进行数据聚合操作。 2. 在SparkSQL中使用UDAF:在SparkSQL中,虽然没有直接提供UDTF(User-Defined Table-Generating Function)函数,但可以使用flatMap来实现一对多的功能。而UDAF可以在学习Hive的时候使用,当内置函数无法满足业务处理需求时,可以考虑使用UDF函数来自定义处理。 综上所述,Spark中的UDAF允许用户根据自己的业务需求定义聚合函数,并在DataFrame或SparkSQL中使用,以实现数据的聚合操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【SparkSql篇02】SparkSql之自定义UDF和UDAF函数1](https://download.csdn.net/download/weixin_35738619/86336713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SparkSQL中自定义聚合(UDAF)函数](https://blog.csdn.net/onway_goahead/article/details/114808782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值