hiveudf和sparkudf开发应用和对比

udf:user define function:用户自定义函数

hive中udf的开发和运用非常普遍

hive中的udf都放在-i的初始化文件里面。所以hive的udf弄好了和hive的内置函数是一样的,但是spark中就不行,因为它是在代码里面嵌入进去,所以不通用。

sparksql里udf开发用的不多,原因有2:

1,无法固化,只能在每个程序内使用,所以无法其他作业复用。如果每个应用里都包含相同功能的udf,如果udf需求有变则维护起来非常麻烦,而hive的udf不存在这个问题

2,大多数功能上都可以用map()替代

cat /opt/cloudy/bin/hive-init.sql可以看到

add jar /opt/cloudy/lib/hiveUDF.jar

create temporary function GetCommonNameOrID as 'com.cloudy.hive.udf.GetCommonNameOrID';

create temporary function GetSaleName as 'ocm.cloudy.hive.udf.GetSaleName';

这是通用的

而spark的udf只能在自己的程序中通过sparksession.udf.register来创建,所以说它复用性不强,不通用

实际开发中都是用map来代替。

以下是sparkudf开发:

import java.util.regex.{Matcher, Pattern}

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import org.apache.spark.storage.StorageLevel

/**
  * Created by zengxiaosen on 16/9/23.
  */
object UseUDF {

  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("useUDF").setMaster("local")
    val ss = SparkSession.builder().config(sparkConf).getOrCreate()
    val sc = ss.sparkContext

    val fileRDD = sc.textFile("/opt/tarballs/spark_kafka/beifengspark/src/main/scala/2015082818")
      .filter(line=>line.length>0)
      .map{
        line =>
          val arr = line.split("\t")
          val date = arr(17).substring(0,10)
          val guid = arr(5)
          val url = arr(1)
          (date,guid,url)
      }.filter(i=>i._3.length>0).persist(StorageLevel.DISK_ONLY)

    //开发一个udf
    /*
    udf在hive中用得多,在spark中用的不多,原因就是其他地方也想用这个udf
    的话没办法传给它,没办法共享,而在hive中很方便,有初始化文件
    hive的udf都放在-i的初始化文件里
     */
    ss.udf.register("getName",(url: String,regex:String) =>{
      val p: Pattern = Pattern.compile(regex)
      val m: Matcher = p.matcher(url)
      if (m.find) {
         m.group(0).split("/")(1).toLowerCase()

      }else null


    })
    import ss.implicits._
    import ss.sql
    //每个活动页带来的流量
    fileRDD.toDF("date","guid","url").createOrReplaceTempView("log03")
    val sql03 =
      s"""
         |select getName(url,'sale/[a-zA-Z0-9]+'),count(distinct guid),
         |count(url) from log03 where url like '%sale%' group by
         |date,getName(url,'sale/[a-zA-Z0-9]+')
       """.stripMargin

    sql(sql03).rdd.foreach(println)

    sc.stop()
    ss.stop()

  }

}




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值