pyspark: удаление подстроки, являющейся значением другого столбца и включающей символы регулярных выражений, из значения данного столбца

#pyspark #databricks #azure-databricks

#pyspark #databricks #azure-databricks

Вопрос:

Допустим, у меня есть фрейм данных типа

 df = spark.createDataFrame(
  [
    ('Test1 This is a test Test2','This is a test'),
    ('That is','That')
  ],
  ['text','name'])


 -------------------------- -------------- 
|text                      |name          |
 -------------------------- -------------- 
|Test1 This is a test Test2|This is a test|
|That is                   |That          |
 -------------------------- -------------- 
 

Если я применяю df.withColumn("new",F.expr("regexp_replace(text,name,'')")).show(truncate=False) , это работает нормально и приводит к

  -------------------------- -------------- ------------ 
|text                      |name          |new         |
 -------------------------- -------------- ------------ 
|Test1 This is a test Test2|This is a test|Test1  Test2|
|That is                   |That          | is         |
 -------------------------- -------------- ------------ 
 

Итак, допустим, у меня есть следующий фрейм данных

  ----------------------------- ----------------- 
|text                         |name             |
 ----------------------------- ----------------- 
|Test1 This is a test( 1 Test2|This is a test( 1|
|That is                      |That             |
 ----------------------------- ----------------- 
 

Если я применяю команду выше, я получаю следующее сообщение об ошибке:

исключение java.util.regex.PatternSyntaxException: висячий мета-символ ‘ amp;#39

Что я могу сделать, чтобы это исключение не возникало самым «pyspark» способом и сохраняло значение в тексте как есть?

Спасибо

Ответ №1:

Вместо regexp_replace этого используйте replace функцию в spark.

replace(str, search[, replace]) — заменяет все вхождения поиска на replace .

Example:

 df.show(10,False)
# ----------------------------- ----------------- 
#|text                         |name             |
# ----------------------------- ----------------- 
#|Test1 This is a test( 1 Test2|This is a test( 1|
#|That is                      |That             |
# ----------------------------- ----------------- 

df.withColumn("new",expr("replace(text,name,'')")).show(10,False)
# ----------------------------- ----------------- ------------ 
#|text                         |name             |new         |
# ----------------------------- ----------------- ------------ 
#|Test1 This is a test( 1 Test2|This is a test( 1|Test1  Test2|
#|That is                      |That             | is         |
# ----------------------------- ----------------- ------------