天天看點

[Spark應用]-- 自定義spark udf計算單詞的長度

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|
+---+

*/      

以上測試已經通過,可以根據自己需要做修改!如有不足之處,請各位批評指正!

繼續閱讀