如何将参数传递给用户定义函数?
Posted
技术标签:
【中文标题】如何将参数传递给用户定义函数?【英文标题】:How to pass the parameter to User-Defined Function? 【发布时间】:2017-11-13 09:31:21 【问题描述】:我有一个用户定义的函数:
calc = udf(calculate, FloatType())
param1 = "A"
result = df.withColumn('col1', calc(col('type'), col('pos'))).groupBy('pk').sum('events')
def calculate(type, pos):
if param1=="A":
a, b = [ 0.05, -0.06 ]
else:
a, b = [ 0.15, -0.16 ]
return a * math.pow(type, b) * max(pos, 1)
我需要将参数param1
传递给这个udf
。我该怎么做?
【问题讨论】:
你可能会超载 udf @MaulikDoshi:你能告诉我怎么做吗? 你能展示一下udf的语法吗? @MaulikDoshi:这是def calculate(type, pos):
。您的意思是您需要查看完整的功能吗?
@Dinosaurius 是的
【参考方案1】:
您可以使用lit
或typedLit
作为udf
的参数,如下所示:
在 Python 中:
from pyspark.sql.functions import udf, col, lit
mult = udf(lambda value, multiplier: value * multiplier)
df = spark.sparkContext.parallelize([(1,),(2,),(3,)]).toDF()
df.select(mult(col("_1"), lit(3)))
在 Scala 中:
import org.apache.spark.sql.functions.udf, col, lit
val mult = udf((value: Double, multiplier: Double) => value * multiplier)
val df = sparkContext.parallelize((1 to 10)).toDF
df.select(mult(col("value"), lit(3)))
【讨论】:
所以,就我而言,我可以使用lit(param1)
?
是的! lit
将充当具有唯一值的另一列。
对不起,我在 Scala 中而不是在 Python 中给了你答案,但想法是一样的!
所以,lit 在df
中创建了一个额外的列?
不确定我是否理解您的担忧,但它不会改变您原来的 df。它将使用lit
的值,并表现得像一个单独的列。以上是关于如何将参数传递给用户定义函数?的主要内容,如果未能解决你的问题,请参考以下文章