UDF(用户自定义函数):将自己写的函数加入到用户 会话,和内置函数一样使用
注意本案例适合spark1.X版的,spark2.x的版本不适用。
=====================================================================================
package com.victor.spark.sqlUDF
import org.apache.spark.sql.{SQLContext, SparkSession}
import org.apache.spark.{SparkConf, SparkContext}
/**
* Company: Huazhong University of science and technology
* 华中科技大学电气学院聚变与等离子体研究所
* Version: V1.0
* Author: Victor
* Contact: 1650996069@qq.com 2018--2020
* Software: IntelliJ IDEA
* File: HobbyCount
* Time: 2018/10/26 17:53
* Desc:将字符串以“,”切分,然后求切分后数组的长度。
**/
//继承App,免去写main方法
object HobbyCount extends App{
//设置Spark运行时的配置参数,setAppName()设置应用程序的名字
//setMaster("local[*]") 设置Spark在本地多线程运行
val conf = new SparkConf().setAppName("UDFHobbyCount").setMaster("local[*]")
//建立Spark上下文,这是通向Spark集群的唯一入口
val sc = new SparkContext(conf)
//建立基于Spark上下文的SQL上下文
val sqlContext = new SparkSession().sqlContext(sc)
//如果不导入,后面的toDF()会出错
//import org.apache.spark.sql.SQLContext.implicits._
case class NameHobbies(name:String,hobbies:String)
val data = Seq(NameHobbies("yexin","jog,code,python,java"),NameHobbies("wuyanqing","R language,C++"))
//加载数据注册为表,名字为:NameHobbiesTable
sc.parallelize(data).toDF().registerTempleTable("NameHobbieTable")
//注册名字为hobby_count的自定义函数:将字符串以“,”切分,然后求切分后数组的长度。
sqlContext.udf.register("hobby_count",(s:String)=>s.split(',').size)
//执行查询操作,打印结果
sqlContext.sql("select *,hobby_count(hobbies) as hobby_count from NameHobbieTable").show()
//执行清理操作,清除中间数据,停止Spark上下文
sc.stop()
}