Spark SQL的自定義函數(shù)UDF使用
Spark_SQL的UDF使用
用戶自定義函數(shù),也叫UDF,可以讓我們使用Python/Java/Scala注冊(cè)自定義函數(shù),并在SQL中調(diào)用。這種方法很常用,通常用來(lái)給機(jī)構(gòu)內(nèi)的SQL用戶們提供高級(jí)功能支持,這樣這些用戶就可以直接調(diào)用注冊(cè)的函數(shù)而無(wú)需自己去通過(guò)編程來(lái)實(shí)現(xiàn)了。
- 在Spark SQL中,編寫UDF 尤為簡(jiǎn)單。Spark SQL不僅有自己的UDF接口,也支持已有的Apache Hive UDF。我們可以使用Spark支持的編程語(yǔ)言編寫好函數(shù),然后通過(guò)Spark SQL內(nèi)建的方法傳遞進(jìn)來(lái),非常便捷地注冊(cè)我們自己的UDF。
- 在Scala和Python中,可以利用語(yǔ)言原生的函數(shù)和lambda語(yǔ)法的支持,而在Java中,則需要擴(kuò)展對(duì)應(yīng)的UDF類。UDF能夠支持各種數(shù)據(jù)類型,返回類型也可以與調(diào)用時(shí)的參數(shù)類型完全不一樣。
UDF簡(jiǎn)單使用
首先通過(guò)代碼建立一個(gè)測(cè)試的DataFrame數(shù)據(jù),通過(guò)RDD產(chǎn)生,再轉(zhuǎn)換成DataFrame格式,通過(guò)寫簡(jiǎn)單的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} // 通過(guò)RDD創(chuàng)建測(cè)試數(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) // 注冊(cè)UDF函數(shù) spark.udf.register("strlen",(x:String)=>x.length) // 創(chuàng)建臨時(shí)表 peopleDF.registerTempTable("people") // 選擇輸出語(yǔ)句,(選擇輸出列:名字,名字長(zhǎng)度,性別從表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]
注冊(cè) 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的相關(guān)資料,wait()是Object類中的方法,而sleep()是Thread類中的靜態(tài)方法,wait()方法用于多個(gè)線程之間的協(xié)作和通信,而sleep()方法用于線程的休眠,需要的朋友可以參考下2024-07-07字節(jié)二面SpringBoot可以同時(shí)處理多少請(qǐng)求
這篇文章主要為大家介紹了字節(jié)二面之SpringBoot可以同時(shí)處理多少請(qǐng)求面試分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07shenyu怎么處理sign鑒權(quán)前置到網(wǎng)關(guān)
這篇文章主要為大家介紹了shenyu怎么處理sign鑒權(quán)前置到網(wǎng)關(guān)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08DUBBO 日志過(guò)濾器,輸出dubbo 接口調(diào)用入?yún)?、出參等信?最新推薦)
這篇文章主要介紹了DUBBO 日志過(guò)濾器,輸出dubbo 接口調(diào)用入?yún)ⅰ⒊鰠⒌刃畔?首先自定義一個(gè)過(guò)濾器?DubboLoggerFilter.java,本文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-12-12Spring(二):Spring通過(guò)IOC來(lái)創(chuàng)建對(duì)象
下面小編就為大家?guī)?lái)一篇詳談Spring對(duì)IOC的理解(推薦篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-07-07Java別說(shuō)取余(%)運(yùn)算簡(jiǎn)單你真的會(huì)嗎
這篇文章主要介紹了Java別說(shuō)取余(%)運(yùn)算簡(jiǎn)單你真的會(huì)嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07java.lang.Long cannot be cast to ja
本文主要介紹了java.lang.Long cannot be cast to java.lang.Integer數(shù)據(jù)類型轉(zhuǎn)換異常解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07新手了解java 數(shù)組基礎(chǔ)知識(shí)
這篇文章主要介紹了Java 數(shù)組分析及簡(jiǎn)單實(shí)例的相關(guān)資料,在Java中它就是對(duì)象,一個(gè)比較特殊的對(duì)象,需要的朋友可以參考下,希望可以對(duì)你有所幫助2021-07-07java實(shí)現(xiàn)AES 32位加密解密的方案
Oracle在其官方網(wǎng)站上提供了無(wú)政策限制權(quán)限文件(Unlimited Strength Jurisdiction Policy Files),我們只需要將其部署在JRE環(huán)境中,就可以解決限制問(wèn)題,下面給大家介紹下java實(shí)現(xiàn)AES 32位加密解密的方案,感興趣的朋友一起看看吧2021-11-11Java中的super關(guān)鍵字_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java中的super關(guān)鍵字的相關(guān)知識(shí),需要的朋友參考下2017-04-04