本文簡單介紹兩種往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|
+----+---+----------------+