我是靠谱客的博主 心灵美星月,最近开发中收集的这篇文章主要介绍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()
}
}




最后

以上就是心灵美星月为你收集整理的hiveudf和sparkudf开发应用和对比的全部内容,希望文章能够帮你解决hiveudf和sparkudf开发应用和对比所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部