我在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())
答案 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