用戶定義標量函數(udf)
適用於:磚運行時
用戶定義標量函數(udf)是作用於一行的用戶可編程例程。本文檔列出了創建和注冊udf所需的類。它還包含演示如何在Spark SQL中定義和注冊udf並調用它們的示例。
UserDefinedFunction
類
要定義用戶定義函數的屬性,可以使用該類中定義的一些方法。
asNonNullable (): UserDefinedFunction:更新
UserDefinedFunction
非空。asNondeterministic (): UserDefinedFunction:更新
UserDefinedFunction
不確定的。withName(name: String): UserDefinedFunction:更新
UserDefinedFunction
有一個名字。
例子
進口org.apache.火花.sql.SparkSession進口org.apache.火花.sql.功能.udf瓦爾火花=SparkSession.構建器().瀏覽器名稱(“Spark SQL UDF標量示例”).getOrCreate()//定義並注冊一個零參數的不確定性UDF// UDF默認是確定的,即對相同的輸入產生相同的結果。瓦爾隨機=udf(()= >數學.隨機())火花.udf.注冊(“隨機”,隨機.asNondeterministic())火花.sql(“選擇隨機()”).顯示()// +-------+// | udf () | . txt// +-------+/ / | xxxxxxx |// +-------+//定義並注冊一個單參數UDF瓦爾plusOne=udf((x:Int)= >x+1)火花.udf.注冊(“plusOne”,plusOne)火花.sql(“選擇plusOne(5)”).顯示()// +------+/ / | UDF (5) |// +------+// | 6| .使用實例// +------+//定義一個雙參數的UDF,一步注冊到Spark火花.udf.注冊(“strLenScala”,(_:字符串).長度+(_:Int))火花.sql(“SELECT strLenScala('test', 1)”).顯示()// +--------------------+// |strLenScala(test, 1)| .使用實例// +--------------------+// | 5| .// +--------------------+// WHERE子句中的UDF火花.udf.注冊(“oneArgFilter”,(n:Int)= >{n>5})火花.範圍(1,10).createOrReplaceTempView(“測試”)火花.sql("SELECT * FROM test WHERE oneArgFilter(id)").顯示()// +---+// | id| .使用實例// +---+// | 6| .使用實例// | 7| .// | 8| .// | 9| .使用實例// +---+
進口org.apache.spark.sql。*;進口org.apache.spark.sql.api.java.UDF1;進口org.apache.spark.sql.expressions.UserDefinedFunction;靜態導入org.apache.spark.sql.functions.udf;進口org.apache.spark.sql.types.DataTypes;SparkSession火花=SparkSession.構建器().瀏覽器名稱(Java Spark SQL UDF標量示例).getOrCreate();//定義並注冊一個零參數的不確定性UDF// UDF默認是確定的,即對相同的輸入產生相同的結果。UserDefinedFunction隨機=udf(()->數學.隨機(),數據類型.倍增式);隨機.asNondeterministic();火花.udf().注冊(“隨機”,隨機);火花.sql(“選擇隨機()”).顯示();// +-------+// | udf () | . txt// +-------+/ / | xxxxxxx |// +-------+//定義並注冊一個單參數UDF火花.udf().注冊(“plusOne”,新UDF1<整數,整數>(){@Override公共整數調用(整數x){返回x+1;}},數據類型.IntegerType);火花.sql(“選擇plusOne(5)”).顯示();// +----------+/ / | plusOne (5) |// +----------+// | 6| .使用實例// +----------+//定義並注冊一個雙參數UDFUserDefinedFunctionstrLen=udf((字符串年代,整數x)->年代.長度()+x,數據類型.IntegerType);火花.udf().注冊(“strLen”,strLen);火花.sql("SELECT strLen('test', 1)").顯示();// +------------+// |UDF(test, 1)|// +------------+// | 5| .// +------------+// WHERE子句中的UDF火花.udf().注冊(“oneArgFilter”,新UDF1<長,布爾>(){@Override公共布爾調用(長x){返回x>5;}},數據類型.BooleanType);火花.範圍(1,10).createOrReplaceTempView(“測試”);火花.sql("SELECT * FROM test WHERE oneArgFilter(id)").顯示();// +---+// | id| .使用實例// +---+// | 6| .使用實例// | 7| .// | 8| .// | 9| .使用實例// +---+