Pyspark子字符串在UDF内不工作

Pyspark子字符串在UDF内不工作,pyspark,Pyspark,我试图在UDF中使用Pyspark子字符串函数,但没有成功。下面是我的代码片段- 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 = ud

我试图在UDF中使用Pyspark子字符串函数,但没有成功。下面是我的代码片段-

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)]

有人能告诉我我做错了什么吗?

您不需要
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
来使用
子字符串
,这里有一种更简洁、更快的方法:

>>> 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
,也可以尝试以下方法:

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。

如果你需要使用
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。

这是因为。你也不能。因为您有一个错误,所以您正在接受真正的错误消息并返回
None
,因为当没有
return
时,python函数就是这样做的。你也不能。因为您有一个,所以您正在吞咽真正的错误消息并返回
None
,因为当没有
return
时,python函数就是这样做的。当您可以避免它们时不要使用udf-s+1当您可以避免它们时不要使用udf-s+1