本文简单介绍两种往SQLContext中注册自定义函数方法
背景:员工表emp,只有name和age两个字段。现在假设员工退休的法定年龄均为60岁,需要计算每个员工剩余工作年限。
val df = sc.parallelize(Seq(("张三", 25), ("李四", ),("赵六", ))).toDF("name", "age")
df.registerTempTable("emp")
+----+---+
|name|age|
+----+---+
| 张三| 25|
| 李四| 30|
| 赵六| 27|
+----+---+
1.1 外部定义函数
定义函数
def remainWorkYears(age: Int) : Int = {
- age
}
注册函数
sqlContext.udf.register("remainWorkYears", remainWorkYears _)
执行函数
sqlContext.sql("select e.*, remainWorkYears(e.age) as remainedWorkYear from emp e").show
+----+---+----------------+
|name|age|remainedWorkYear|
+----+---+----------------+
| 张三| 25| 35|
| 李四| 30| 30|
| 赵六| 27| 33|
+----+---+----------------+
1.2 匿名函数
注册匿名函数
sqlContext.udf.register("remainWorkYears_anoymous", (age: Int) => {
- age
})
执行函数
sqlContext.sql("select e.*, remainWorkYears_anoymous(e.age) as remainedWorkYear from emp e").show
+----+---+----------------+
|name|age|remainedWorkYear|
+----+---+----------------+
| 张三| 25| 35|
| 李四| 30| 30|
| 赵六| 27| 33|
+----+---+----------------+