Learning Spark [5] - UDF(User-defined Function)

UDF

為了滿足用戶的不同的分析需求,Spark允許使用者自己定義函數(shù),供用戶在Spark SQL中使用。例如數(shù)據(jù)科學(xué)家可以將一個(gè)機(jī)器學(xué)習(xí)模型封裝在一個(gè)函數(shù)內(nèi),提供給數(shù)據(jù)分析師在無需知道模型內(nèi)部復(fù)雜的知識(shí)下,直接使用。

例子:創(chuàng)建一個(gè)返回立方的函數(shù)

# in Python
from pyspark.sql.types import LongType

# create function
def cubed(num):
    return num ** 3

# register UDF
spark.udf.register('cubed', cubed, LongType())

# generate a temp view
spark.range(1,9).createOrReplaceTempView('udf_test')

# query
spark.sql('SELECT id, cubed(id) AS id_cubed FROM udf_test').show()
+---+--------+
| id|id_cubed|
+---+--------+
|  1|       1|
|  2|       8|
|  3|      27|
|  4|      64|
|  5|     125|
|  6|     216|
|  7|     343|
|  8|     512|
+---+--------+

Pandas-UDF

為了提升UDF的計(jì)算效率,可以使用Python中的Pandas包來創(chuàng)建Pandas UDF(或者叫向量化(Vectorized)UDF)。

關(guān)于向量化函數(shù),在Pandas包以及R中的dply族函數(shù),都是很好的例子。

# In Python
import pandas as pd
from pyspark.sql.functions import col, pandas_udf
from pyspark.sql.types import LongType

def cubed(a: pd.Series) -> pd.Series:
    return a ** 3

cubed_udf = pandas_udf(cubed, returnType = LongType())

spark.range(1,9).createOrReplaceTempView('udf_test')

spark.sql('SELECT id, cubed(id) AS id_cubed FROM udf_test').show()
+---+--------+
| id|id_cubed|
+---+--------+
|  1|       1|
|  2|       8|
|  3|      27|
|  4|      64|
|  5|     125|
|  6|     216|
|  7|     343|
|  8|     512|
+---+--------+
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容