pyspark udf AttributeError:';非类型';对象没有属性';rfind';

pyspark udf AttributeError:';非类型';对象没有属性';rfind';,pyspark,Pyspark,尝试在列中使用simpleudf,我得到以下错误 实际上,订单号是一种字符串类型,它的值如下所示,并且没有空值 1234.345.344343434 代码: order_udf = udf(lambda x: x[x.rfind(".") + 1:], StringType()) df.withColumn("order_number", order_udf('order_number')).show() 我需要更改udf调用中的某些内容吗?您可以不使用udf:(使用split和elemen

尝试在
列中使用simple
udf
,我得到以下错误

实际上,订单号是一种字符串类型,它的值如下所示,并且没有空值

1234.345.344343434
代码:

order_udf = udf(lambda x: x[x.rfind(".") + 1:], StringType())
df.withColumn("order_number", order_udf('order_number')).show()
我需要更改udf调用中的某些内容吗?

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

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


我们可以
拆分
上的订单号
,然后获取数组的
最后一个元素
(或者)我们可以使用
regexp\u extract
函数仅从最后一个
中获取订单号

示例:

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   |
#+------------+

我们可以
拆分
上的订单号
,然后获取数组的
最后一个元素
(或者)我们可以使用
regexp\u extract
函数仅从最后一个
中获取订单号

示例:

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   |
#+------------+

我能够执行上面的代码,并得到订单号为
34434
。我在本地执行时也得到了这个,但在集群中它不起作用。。我希望这与数据类型没有正确通过有关Lyok。。使用
udf
而不是常规spark函数背后是否有具体原因?像regexp_replace(或)split吗?@Shu:不,我想用这个很简单?我们可以用regexp\u替换吗?基本上,我需要得到订单号的最后一部分。我能够执行上面的代码,并以
3443434
的形式得到订单号。我在本地执行时也得到了这一点,但在集群中它不起作用。。我希望这与数据类型没有正确通过有关Lyok。。使用
udf
而不是常规spark函数背后是否有具体原因?像regexp_replace(或)split吗?@Shu:不,我想用这个很简单?我们可以用regexp\u替换吗?基本上,我需要得到订单号的最后一部分。为什么我们需要使用元素?为什么我们不能使用
split(col(“o”),“\”)[2]
@Shankar,如果您的数据中总是有两个“.”,那么就可以使用了。。为了使它更具动态性,我们使用-1,那么我们将始终从数组中获取最后一个元素!为什么我们需要使用element_at,为什么我们不能只使用
split(col(“o”),“\”)[2]
@Shankar,如果您的数据中总是有两个“.”,那么就可以使用了。。为了使它更具动态性,我们使用-1,那么我们将始终从数组中获取最后一个元素!