Spark SQL的自定義函數(shù)UDF使用
Spark_SQL的UDF使用
用戶自定義函數(shù),也叫UDF,可以讓我們使用Python/Java/Scala注冊自定義函數(shù),并在SQL中調(diào)用。這種方法很常用,通常用來給機(jī)構(gòu)內(nèi)的SQL用戶們提供高級(jí)功能支持,這樣這些用戶就可以直接調(diào)用注冊的函數(shù)而無需自己去通過編程來實(shí)現(xiàn)了。
- 在Spark SQL中,編寫UDF 尤為簡單。Spark SQL不僅有自己的UDF接口,也支持已有的Apache Hive UDF。我們可以使用Spark支持的編程語言編寫好函數(shù),然后通過Spark SQL內(nèi)建的方法傳遞進(jìn)來,非常便捷地注冊我們自己的UDF。
- 在Scala和Python中,可以利用語言原生的函數(shù)和lambda語法的支持,而在Java中,則需要擴(kuò)展對(duì)應(yīng)的UDF類。UDF能夠支持各種數(shù)據(jù)類型,返回類型也可以與調(diào)用時(shí)的參數(shù)類型完全不一樣。
UDF簡單使用
首先通過代碼建立一個(gè)測試的DataFrame數(shù)據(jù),通過RDD產(chǎn)生,再轉(zhuǎn)換成DataFrame格式,通過寫簡單的UDF函數(shù),對(duì)數(shù)據(jù)進(jìn)行操作并輸出,例如:
import org.apache.spark.sql.Row
import org.apache.spark.rdd._
import scala.collection.mutable.ArrayBuffer
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType}
// 通過RDD創(chuàng)建測試數(shù)據(jù)
val rdd: RDD[Row] = sc.parallelize(List("Michael,male, 29",
"Andy,female, 30",
"Justin,male, 19",
"Dela,female, 25",
"Magi,male, 20",
"Pule,male,21"))
.map(_.split(",")).map(p => Row(p(0),p(1),p(2).trim.toInt))
// 創(chuàng)建Schema
val schema = StructType( Array( StructField("name",StringType, true),StructField("sex",StringType, true),StructField("age",IntegerType,true)))
// 轉(zhuǎn)換DataFrame
val peopleDF = spark.sqlContext.createDataFrame(rdd,schema)
// 注冊UDF函數(shù)
spark.udf.register("strlen",(x:String)=>x.length)
// 創(chuàng)建臨時(shí)表
peopleDF.registerTempTable("people")
// 選擇輸出語句,(選擇輸出列:名字,名字長度,性別從表people中)
spark.sql("select name, strlen(name) as strlen,sex from people").show()
創(chuàng)建 DataFrame
scala> val df = spark.read.json("data/user.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, username: string]
注冊 UDF
scala> spark.udf.register("addName",(x:String)=> "Name:"+x)
res9: org.apache.spark.sql.expressions.UserDefinedFunction =
UserDefinedFunction(<function1>,StringType,Some(List(StringType)))
創(chuàng)建臨時(shí)表
scala> df.createOrReplaceTempView("people")應(yīng)用 UDF
scala> spark.sql("Select addName(name),age from people").show()到此這篇關(guān)于Spark SQL的自定義函數(shù)UDF使用的文章就介紹到這了,更多相關(guān)Spark SQL UDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用ArrayList實(shí)現(xiàn)撲克牌的示例代碼
學(xué)習(xí)了關(guān)于集合類的知識(shí),我們可以做一個(gè)小項(xiàng)目來加深對(duì)集合類知識(shí)的學(xué)習(xí)!本文就來利用ArrayList實(shí)現(xiàn)撲克牌發(fā)牌洗牌效果,需要的可以參考一下2022-10-10
關(guān)于idea中SpringBoot啟動(dòng)失敗的坑
這篇文章主要介紹了關(guān)于idea中SpringBoot啟動(dòng)失敗的坑,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
關(guān)于Spring的統(tǒng)一功能處理(攔截器)實(shí)現(xiàn)
這篇文章主要介紹了關(guān)于Spring的統(tǒng)一功能處理(攔截器)實(shí)現(xiàn),每個(gè)方法中都要單獨(dú)寫用戶登錄驗(yàn)證的方法,即使封裝成公共方法,也一樣要傳參調(diào)用和在方法中進(jìn)行判斷,需要的朋友可以參考下2023-05-05
Maven中<distributionManagement>的使用及說明
本文主要介紹了Maven中的SNAPSHOT和RELEASE倉庫的區(qū)別,以及如何在POM文件中配置和使用快照版本,快照版本可以實(shí)現(xiàn)實(shí)時(shí)更新,方便開發(fā)過程中的依賴管理,同時(shí),本文還總結(jié)了Maven的一些常用命令及其作用2025-01-01
Java?OpenCV圖像處理之SIFT角點(diǎn)檢測詳解
SIFT,即尺度不變特征變換,是用于圖像處理領(lǐng)域的一種描述。這種描述具有尺度不變性,可在圖像中檢測出關(guān)鍵點(diǎn),是一種局部特征描述子。本文將詳細(xì)介紹一下Java?OpenCV圖像處理中的SIFT角點(diǎn)檢測,需要的可以參考一下2022-02-02
IntelliJ IDEA修改內(nèi)存大小,使得idea運(yùn)行更流暢
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA修改內(nèi)存大小,使得idea運(yùn)行更流暢的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
解決Mybatis-plus自定義TypeHandler查詢映射結(jié)果一直為null問題
這篇文章主要介紹了解決Mybatis-plus自定義TypeHandler查詢映射結(jié)果一直為null問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

