使用pyspark UDF替换电话号码中的字符

时间:2019-05-21 12:29:08

标签: python pyspark

我写了一个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

2 个答案:

答案 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等效,但是空格已删除。其他替换调用无效。