замена символов из телефонных номеров с помощью pyspark UDF - PullRequest
1 голос
/ 21 мая 2019

Я написал код 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 ]

3 голосов
/ 21 мая 2019

В этом случае лучше использовать pyspark.sql.functions.regexp_replace() вместо , используя 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 s.
2 голосов
/ 21 мая 2019

Вы переназначаете 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, но с удаленными пробелами.Другие вызовы замены не имеют никакого эффекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...