【问题标题】:Pyspark substring is not working inside of UDFPyspark 子字符串在 UDF 内部不起作用
【发布时间】:2020-02-06 15:12:21
【问题描述】:

我试图在 UDF 中使用 Pyspark 子字符串函数是徒劳的。下面是我的代码 sn-p -

from pyspark.sql.functions import substring

def my_udf(my_str):
    try:
        my_sub_str = substring(my_str,1, 2)
    except Exception:
        pass
    else:
        return (my_sub_str)

apply_my_udf = udf(my_udf)

df = input_data.withColumn("sub_str", apply_my_udf(input_data.col0))

样本数据是-

ABC1234
DEF2345
GHI3456

但是当我打印 df 时,我在新列“sub_str”中没有得到任何值,如下所示 -

[Row(col0='ABC1234', sub_str=None), Row(col0='DEF2345', sub_str=None), Row(col0='GHI3456', sub_str=None)]

谁能告诉我我做错了什么?

【问题讨论】:

标签: pyspark


【解决方案1】:

您不需要udf 即可使用substring,这是一种更简洁、更快捷的方式:

>>> from pyspark.sql import functions as f
>>> df.show()
+-------+
|   data|
+-------+
|ABC1234|
|DEF2345|
|GHI3456|
+-------+

>>> df.withColumn("sub_str", f.substring("data", 1, 2)).show()
+-------+-------+
|   data|sub_str|
+-------+-------+
|ABC1234|     AB|
|DEF2345|     DE|
|GHI3456|     GH|
+-------+-------+ 

【讨论】:

  • 可以避免的时候不要使用udf-s +1
【解决方案2】:

如果您需要为此使用udf,您也可以尝试以下操作:

input_data = spark.createDataFrame([
    (1,"ABC1234"), 
    (2,"DEF2345"),
    (3,"GHI3456")
], ("id","col0"))

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

udf1 = udf(lambda x:x[0:2],StringType())
df.withColumn('sub_str',udf1('col0')).show()

+---+-------+-------+
| id|   col0|sub_str|
+---+-------+-------+
|  1|ABC1234|     AB|
|  2|DEF2345|     DE|
|  3|GHI3456|     GH|
+---+-------+-------+

但是,正如 Mohamed Ali JAMAOUI 所写 - 您可以在这里轻松地不使用 udf。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多