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