python-Pyspark UDF可以 job,除非我调用任何内置函数


0

我试图实现一个pyspark函数来执行半偶数舍入。问题是,如果我只是返回传入的值,那么构建就可以 job。如果它做了别的什么,我会得到一个模糊的错误。这是我的自定义项:

@udf(returnType=DecimalType())
def round_half_even(number):
  return number

我只是在 DataFrame 上的select中调用udf,如下所示:

df1 = spark.read...
df1.select(
    df1.COST,
    round_half_even(f.lit(17.45)).alias('V_COST_TOTAL_CALC')
)

但是这个实际上是取整的版本失败了:

@udf(returnType=DecimalType())
def round_half_even(number):
  return round(number, 0)

出现此错误时:

TypeError: type NoneType doesn't define __round__ method

我对Python还不太熟悉,所以我真的不知道如何追踪它。看起来python环境并不真正可用,但这应该是spark的问题,而不是我的问题。

编辑:回顾这个问题后,我意识到spark有一个bround函数,它做半偶数舍入。我仍然需要解决这个问题,因为我有几个udf都因为同样的原因失败了,而这一个似乎是最简单的。

更新:

@udf(returnType=DecimalType())
def round_half_even(number):
  return round(number, 0) if number is not None else None

这允许它完成,但现在我得到的只是目标中的空值,即使像上面的示例那样传入文本值。我已经验证了应该有100个成千上万的非空值。

2 答案


0

如果列中有空值,那么PySpark不会为这些值传递任何值,而round()函数不会处理任何值。应该采取如下措施:

@udf(returnType=DecimalType())
def round_half_even(number):
  return round(number, 0) if number is not None else None

注意,对非None值的正确检查是var不是None。在布尔上下文中,整数和浮点零的计算结果为false。


0

参数'number'可能为None,只需在调用round方法之前进行检查。

PS:PySpark UDF中提供了所有Python内置函数。如果要调用任何其他方法/库,则必须将其导入到UDF中。


我来回答

写文章

提问题

面试题