pyspark udf AttributeError: объект 'NoneType' не имеет атрибута 'rfind' - PullRequest
1 голос
/ 04 марта 2020

Пытаясь использовать простые 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 ]

2 голосов
/ 04 марта 2020

Мы можем split номер заказа на ., затем получить last element of array (или), которую мы можем использовать regexp_extract, чтобы получить только порядковый номер из последнего ..

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   |
#+------------+
2 голосов
/ 04 марта 2020

Вы можете обойтись без udf: (используя split и element_at)

from pyspark.sql import functions as F
list=[['1234.345.344343434']]
df=spark.createDataFrame(list,['value'])
df.show()


+------------------+
|             value|
+------------------+
|1234.345.344343434|
+------------------+


df.withColumn("value", F.element_at(F.split("value",'\.'),-1)).show()

+---------+
|value    |
+---------+
|344343434|
+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...