pyspark系列 - 如何傳遞所有 column 給 UDF 實例

How to pass all dataframe cloumns to UDF?

在本範例你會學到:

  • 簡易UDF (User Define function) 使用方式
  • 傳遞多參數給UDF

1.定義UDF

# function for summing
def get_total(*columns):
    total = 0
    for col_value in columns:
        total += col_value
    return total

# Define udf type and func
udf_get_total = F.udf(get_total,IntegerType())

2.將所有column傳給UDF

  • 沒什麼特別的用法,就是用全部的欄位作為一個 list 傳入 *[col for col in df.columns]

  • df.columns 為全部的欄位

df.withColumn('sum',udf_get_total(*[col for col in df.columns])).show()

3.完整的範例

from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
from pyspark.sql.types import *

spark = SparkSession.builder.appName('pass_columns').getOrCreate()

# function for summing
def get_total(*columns):
    total = 0
    for col_value in columns:
        total += col_value
    return total

# Create dataframe
df = spark.createDataFrame([(1, 2, 3, 4, 5, 6),(12, 24, 33, 44, 54, 66)], ["A", "B", "C", "D", "E", "F"])

# Define udf type and func
udf_get_total = F.udf(get_total,IntegerType())

# pass all column to UDF and create a new column for summing result.
df.withColumn('sum',udf_get_total(*[col for col in df.columns])).show()

4.資料與結果

原始資料示意圖
最後結果示意圖

以上為簡略的說明,若有疑問請在留言區發問,若是文章有幫助到你也可以讓我知道。


 上一篇
pyspark 系列 - 在 lit 中使用 Array(Arraylist) 教學 pyspark 系列 - 在 lit 中使用 Array(Arraylist) 教學
How to pass array to pyspark lit function?在本範例你會學到: 如何使用 lit 函式 將 array 傳給 lit 解決以下問題 py4j.protocol.Py4JJavaError: An
2019-11-26
下一篇 
使用 Docker 建立JupyterHub 與 OAuth 憑證安裝流程 使用 Docker 建立JupyterHub 與 OAuth 憑證安裝流程
How to use docker launch JupyterHub on GCP and login with OAuth?由於公司有相關的需求,就埋頭來研究一下 JupyterHub 的安裝與建置,網路上雖然有很多相關的參考文章了依然
2019-11-18
  目錄