pyspark udf AttributeError:“ NoneType”对象没有属性“ rfind”

时间:2020-03-04 17:31:27

标签: pyspark

尝试在udf内使用简单的withColumn,出现以下错误。

实际上,订单号是字符串类型,其值如下所示,并且没有空值。

1234.345.344343434

代码:

order_udf = udf(lambda x: x[x.rfind(".") + 1:], StringType())
df.withColumn("order_number", order_udf('order_number')).show()

我需要在udf通话中更改某些内容吗?

2 个答案:

答案 0 :(得分:2)

您可以不使用udf :(使用split和element_at)

extShutdownHook

答案 1 :(得分:2)

我们可以 split .上的订单号,然后获取last element of array(或者)我们可以使用 regexp_extract 函数仅从最后一个.中获取order_number。

Example:

from pyspark.sql.functions import *

df1=sc.parallelize([('1234.345.344343434',)]).toDF(["o"])
df1.withColumn("arr", split(col("o"),'\.')).selectExpr("arr[size(arr)-1] as order_number").show(10,False)

#starting from spark2.4+ we can use element_at function
df1.withColumn("arr", element_at(split(col("o"),'\.'),-1)).show(10,False)

#using regexp_extract function
df1.withColumn("order_number",regexp_extract(col('o'),'(?=[^.]+$)(.*)',1)).show()

#+------------+
#|order_number|
#+------------+
#|344343434   |
#+------------+