Spark Sql的UDF函數非常好用,相比Hive,很簡潔
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.Row
/**
* scala内置函數,使用者自定義函數
* 統計單詞的長度
*
*/
object UDF {
def main(args:Array[String]):Unit={
//1\擷取context
val sc=new SparkContext(new SparkConf().setAppName("UDFTest").setMaster("local[1]"))
//2\擷取sqlContext
val sqlContext=new SQLContext(sc)
//3\建立測試資料Array
val datas=Array("tim","jony","cassis","fang")
//4\并行化,建立RDD
val dataRDD=sc.parallelize(datas,4)
//5\轉換為row
val rows=dataRDD.map { x => Row(x) }
//6\建立structType
val structType=StructType(Array(StructField("name",StringType,true)))
//7\建立Dataframe
val df=sqlContext.createDataFrame(rows, structType)
//8\系統資料庫
df.registerTempTable("t_test")
//9\注冊統計長度的函數
sqlContext.udf.register("str_len", (str:String)=>str.length())
//10\sql語句,列印輸出
// sqlContext.sql("select str_len(name) from t_test").collect().foreach { x => println("長度是:"+x) }
sqlContext.sql("select str_len(name) from t_test").show()
//關閉資源
sc.stop()
}
}
/**
結果:
+---+
|_c0|
+---+
| 3|
| 4|
| 6|
| 4|
+---+
*/
以上測試已經通過,可以根據自己需要做修改!如有不足之處,請各位批評指正!