说明
UDF,User-Defined Functions,用户定义的hive函数。
spark自带的函数并不能完全满足业务需求,这时就需要我们自定义函数了
UDF 特点:one to one,进来一个出去一个,是row级别操作,如:upper、substr函数
案例
根据 id分组对 ele_num 列求和,如果和大于 650 ,显示 过冲;等于 650 显示 充满;小于 650 显示 未充满
代码
package udf
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
object Std1 {
def main(args: Array[String]): Unit = {
val sc = new SparkConf().setMaster("local[*]").setAppName("std")
val spark = SparkSession.builder().config(sc).getOrCreate()
val df: DataFrame = spark.read
.option("header", "false") //默认为false,表示第一行不是表头
.option("sep", ",") //列分隔符
.csv("cdz.txt") //读取文件
.toDF("id","ele_num","time","start_time","end_time")
df.printSchema()
//创建临时视图(只能查询不能修改)
df.createOrReplaceTempView("cdz")
// 自定义函数,data 传入数据
spark.udf.register("warn",(data:Double) =>{
var ret:String = ""
if(data>650){
ret = "过冲"
}else if(data == 650){
ret = "充满"
}else{
ret = "未充满"
}
ret // 返回数据
})
val res: DataFrame = spark.sql("select id,sum(ele_num) as sum,warn(sum(ele_num)) as `状态` from cdz group by id")
res.show()
spark.close()
}
}