天天看點

SQLContext自定義函數注冊

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

繼續閱讀