【问题标题】:pyspark udf AttributeError: 'NoneType' object has no attribute 'rfind'pyspark udf AttributeError:“NoneType”对象没有属性“rfind”
【发布时间】:2020-03-05 02:16:04
【问题描述】:

尝试在withColumn 中使用简单的udf,我收到以下错误。

实际上订单号是一个字符串类型,它的值类似于下面这样,它没有空值。

1234.345.344343434

代码:

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

我需要在 udf 调用中更改某些内容吗?

【问题讨论】:

  • 我能够执行上面的代码并得到订单号为344343434
  • 我在本地执行时也遇到了这个问题,但在集群中它不起作用..我希望这与 DataType 没有正确传递有关
  • ok.. 使用 udf 而不是常规的 spark 函数背后有什么具体原因吗?像regexp_replace(或)拆分?
  • @Shu: 不,我以为用这个很简单?我们可以为此使用 regexp_replace 吗?基本上我需要得到订单号的最后一部分

标签: pyspark


【解决方案1】:

我们可以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   |
#+------------+

【讨论】:

  • 为什么我们需要使用element_at,为什么我们不能只使用split(col("o"),'\.')[2]
  • @Shankar ,如果你的数据总是有两个'。' 那么它可以使用.. 使它更动态的方式我们使用 -1 那么我们将总是从数组中获取最后一个元素!
【解决方案2】:

你可以不用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|
+---------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2016-09-12
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多