PySpark regex engine не соответствует - PullRequest
1 голос
/ 20 ноября 2019

Я работаю над регулярным выражением, чтобы применить его к столбцу PySpark DataFrame.

Я не могу воспроизвести в PySpark результат моего рабочего регулярного выражения , запущенного здесь в regex101 .

Я пробовал несколько методов (см. Ниже), но ни один из них, похоже, не работает (даже протестирован на конкретном движке Java regex). Я хотел бы принести группу показала на примере выше

(\w+(?:\s*|\d*)\s+RUE\s.*)
[\s\-]+(\d*\s*RUE\s+.*)

образца кода:.

df = spark.createDataFrame([
    ('RESIDENCE LA VENDEENNE 80 81 RUE LOUIS LUMIERE',)
], ["adresse1"])

df.withColumn("adresse1", regexp_replace("adresse1", "(\w+(?:\s*|\d*)\s+RUE\s.*)", '$1')).show(truncate=False)

Выход я получаю мои без изменений колонка:

+-----------------------------------------------+
|adresse1                                       |
+-----------------------------------------------+
|RESIDENCE LA VENDEENNE 80  81 RUE LOUIS LUMIERE|
+-----------------------------------------------+

1017 * Когда я ожидал столбец, который будет оценен в
81 RUE LOUIS LUMIERE

до сих пор я абсолютно не догадаться, тем более, что мои предыдущие работы (соответствие), как прогнозировалось.


1023 * Свеча конфигурация:
  • версия 2.4.0-cdh6.2.0
  • OpenJDK 64-разрядный сервер VM,1.8.0_222

1 Ответ

2 голосов
/ 20 ноября 2019

Я думаю, вы должны использовать regexp_extract вместо regexp_replace:

from pyspark.sql.functions import regexp_extract

df.withColumn(
    "adresse1", 
    regexp_extract("adresse1", r"(\w+(?:\s*|\d*)\s+RUE\s.*)", 1)
).show(truncate=False)
#+--------------------+
#|adresse1            |
#+--------------------+
#|81 RUE LOUIS LUMIERE|
#+--------------------+

Чтобы сохранить значение столбца неизменным, еслишаблон не соответствует, вы можете использовать pyspark.sql.Column.rlike и when:

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