我写了一个pyspark代码,执行以下操作,但未按预期工作。谁能指出我的错误
# Data cleaning function
def clean_data(data):
rep = data.replace('/','')
rep = data.replace('-','')
rep = data.replace('+','')
rep = data.replace(' ','')
return rep
#clean_data_udf_int = udf(lambda z: clean_data(z), StringType())
#con.show(4)
clean_data_udf = udf(clean_data, StringType())
con = con.withColumn('ph1_f',clean_data_udf('phone1'))
输入数据框为反色
id phone phone1
1 098 /90
2 + 91 -90
我希望数据帧的输出是:
id phone phone1
1 98 90
2 91 90
答案 0 :(得分:3)
在这种情况下,最好使用pyspark.sql.functions.regexp_replace()
而不是using a udf
。
from pyspark.sql.functions import col, regexp_replace
def clean_data(data):
rep = regexp_replace(data, "[\/\-\+ ]", '')
rep = regexp_replace(rep, "^0", '')
return rep
df = df.select(
"id",
clean_data(col("phone")).alias("phone"),
clean_data(col("phone1")).alias("phone1")
)
df.show()
#+---+-----+------+
#| id|phone|phone1|
#+---+-----+------+
#| 1| 98| 90|
#| 2| 91| 90|
#+---+-----+------+
由于您要替换的某些字符在正则表达式中具有特殊含义,因此需要使用\
对其进行转义。
第一个模式表示:
[\/\-\+ ]
:匹配["/", "-", "+", " "]
中出现的单个字符第二个替换模式表示:
^0
:从字符串的开头开始替换为0。如果您希望有多个前导^0+
,可以将其更改为0
。答案 1 :(得分:2)
您每次使用rep
时都会重新分配replace
,而不是在第一次分配后替换rep
中的更多内容;
def clean_data(data):
rep = data.replace('/','')
# Now start replacing more things in 'rep' and not the original 'data'
rep = rep.replace('-','')
rep = rep.replace('+','')
rep = rep.replace(' ','')
return rep
否则,在您上次通话时,rep = data.replace(' ','')
rep
与原始data
等效,但是空格已删除。其他替换调用无效。