如何将参数传递给用户定义函数?

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】:

您可以使用littypedLit 作为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 的值,并表现得像一个单独的列。

以上是关于如何将参数传递给用户定义函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给用户定义函数?

如何将用户定义的参数传递给 rpmbuild 以填充变量

如何将附加参数传递给自定义 python 排序函数

distutils:如何将用户定义的参数传递给 setup.py?

如何将用户输入参数传递给我的云函数?

如何将关键字参数作为参数传递给函数?