如何将if-then表达式添加到用户定义的函数中?

时间:2017-07-27 13:55:26

标签: python python-3.x apache-spark

我在python Spark中有这个用户定义的函数:

result = udf(lambda num1, num2:  (num1 - num2) / math.sqrt(1-(num1/num2)), FloatType())

我想添加num1/num2大于1的支票。如果它低于1,那么num1应该等于num2

if (num1/num2 > 1): 
        num1 = num2

如何将此简单检查添加到udf表达式?

我试过了,但似乎失败了:

def calculate(num1, num2):
    if (num1/num2 > 1): 
        num1 = num2
    result = (num1 - num2) / math.sqrt(1-(num1/num2))
    return result   
calc_z = udf(lambda num1, num2: calculate, FloatType())

4 个答案:

答案 0 :(得分:2)

您可以使用where函数获取结果,如下所示

df.withColumn("result", when(($"num1" / $"num2") < 1, $"num2")
  .otherwise($"num1"))

使用可用功能而不是使用UDF总是更好。

如果您仍想使用UDF,可以在udf上方注册为

calc_z = udf(calculate, FloatType())

希望这有帮助!

答案 1 :(得分:1)

如果您将num1替换为:{/ p>,则可以在您的案例中动态分配num1

(num2 if num1/num2 > 1 else num1)

答案 2 :(得分:1)

您需要在lambda中调用该函数。

def calculate(num1, num2):
    if (num1/num2 > 1): 
        num1 = num2
    result = (num1 - num2) / math.sqrt(1-(num1/num2))
    return result   
calc_z = udf(lambda num1, num2: calculate(num1, num2), FloatType())

不是调用计算的最后一行的更改。

编辑(基于@bruno desthuilliers):

def calculate(num1, num2):
    if (num1/num2 > 1): 
        num1 = num2
    result = (num1 - num2) / math.sqrt(1-(num1/num2))
    return result   
calc_z = udf(calculate, FloatType())

答案 3 :(得分:1)

你的lambda正在返回一个尚未调用的函数。试试这个。

def calculate(num1, num2):
    if (num1/num2 > 1): 
        num1 = num2
    result = (num1 - num2) / math.sqrt(1-(num1/num2))
    return result   
calc_z = udf(calculate, FloatType()) # Changed this line