Заменить строку в кадре данных Spark на основе карты регулярных выражений с ее заменами + SCALA - PullRequest
1 голос
/ 10 апреля 2019

У меня есть DataFrame, как показано ниже.

+-----------------------------------+
|mycol                              |
+-----------------------------------+
|12 https://jhafi.com xyza@gmail.com|
|12 https://jhafi.com xyza@gmail.com|
|12 https://jhafi.com xyza@gmail.com|
|12 https://jhafi.com xyza@gmail.com|
+-----------------------------------+

У меня есть карта замены, как показано ниже.

Map( PHTEXTEMAIL  -> """(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""" , PHTEXTURL -> "(^|\\W)(?:(?:https?|ftp|file):\\/\\/|www\\.|ftp\\.)(?:\\([-A-Z0-9+&@#\\/%=~_|$?!:,.]*\\)|[-A-Z0-9+&@#\\/%=~_|$?!:,.])*(?:\\([-A-Z0-9+&@#\\/%=~_|$?!:,.]*\\)|[A-Z0-9+&@#\\/%=~_|$])($|\\W)", PHTEXTEMAIL  -> """(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""")

Теперь я хочу повторить эту карту замены и применить ее кмой фрейм данных.

Ожидаемый фрейм данных.

+------------------------+
|mycol                   |
+------------------------+
|12 PHTEXTURL PHTEXTEMAIL|
|12 PHTEXTURL PHTEXTEMAIL|
|12 PHTEXTURL PHTEXTEMAIL|
|12 PHTEXTURL PHTEXTEMAIL|
+------------------------+

1 Ответ

0 голосов
/ 10 апреля 2019

Выход прямо с функцией regexp_replace.

import spark.implicits._
import org.apache.spark.sql.functions._

val df = Seq("12 https://jhafi.com xyza@gmail.com",
  "12 https://jhafi.com xyza@gmail.com",
  "12 https://jhafi.com xyza@gmail.com",
  "12 https://jhafi.com xyza@gmail.com").toDF("mycol")


val email = """(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b"""
val url ="(https?:\\/\\/(?:www\\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\\.[^\\s]{2,}|www\\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\\.[^\\s]{2,}|https?:\\/\\/(?:www\\.|(?!www))[a-zA-Z0-9]+\\.[^\\s]{2,}|www\\.[a-zA-Z0-9]+\\.[^\\s]{2,})"

val urlRegexExpression = regexp_replace($"mycol", url, "PHTEXTURL")
val emailRegexExpression = regexp_replace($"mycol", email, "PHTEXTEMAIL")

df.withColumn("mycol", emailRegexExpression).withColumn("mycol", urlRegexExpression).show(false)

Выход

+------------------------+
|mycol                   |
+------------------------+
|12 PHTEXTURL PHTEXTEMAIL|
|12 PHTEXTURL PHTEXTEMAIL|
|12 PHTEXTURL PHTEXTEMAIL|
|12 PHTEXTURL PHTEXTEMAIL|
+------------------------+

Примечание:

Я внес изменения в регулярное выражение вашего URL, так как он не работал.

Надеюсь, это решит вашу проблему.

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