Как получить строки, где поле содержит (), []% или +.используя функцию rlike SparkSQL - PullRequest
0 голосов
/ 27 февраля 2019

Допустим, у вас есть фрейм данных Spark с несколькими столбцами, и вы хотите вернуть строки, в которых столбцы содержат определенные символы.В частности, вы хотите вернуть строки, в которых хотя бы одно из полей содержит (), []% или +.Каков правильный синтаксис, если вы хотите использовать Spark SQL rlike функцию?

import spark.implicits._

val dummyDf = Seq(("John[", "Ha", "Smith?"),
                 ("Julie", "Hu", "Burol"),
                  ("Ka%rl", "G", "Hu!"),
                  ("(Harold)", "Ju", "Di+")
                 ).toDF("FirstName", "MiddleName", "LastName")
dummyDf.show()

+---------+----------+--------+
|FirstName|MiddleName|LastName|
+---------+----------+--------+
|    John[|        Ha|  Smith?|
|    Julie|        Hu|   Burol|
|    Ka%rl|         G|     Hu!|
| (Harold)|        Ju|     Di+|
+---------+----------+--------+

Expected Output

+---------+----------+--------+
|FirstName|MiddleName|LastName|
+---------+----------+--------+
|    John[|        Ha|  Smith?|
|    Ka%rl|         G|     Hu!|
| (Harold)|        Ju|     Di+|
+---------+----------+--------+

Мои несколько попыток возвращают ошибки или нет, даже если я пытаюсь сделать это только для поиска (.

*)1005 * Я знаю, что мог бы использовать простую конструкцию like несколько раз, но я пытаюсь сделать это более кратким способом с помощью регулярных выражений и Spark SQL.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы можете попробовать это, используя rlike метод:

dummyDf.show()

+---------+----------+--------+
|FirstName|MiddleName|LastName|
+---------+----------+--------+
|    John[|        Ha|  Smith?|
|    Julie|        Hu|   Burol|
|    Ka%rl|         G|     Hu!|
| (Harold)|        Ju|     Di+|
|     +Tim|      Dgfg|   Ergf+|
+---------+----------+--------+

val df = dummyDf.withColumn("hasSpecial",lit(false))

val result = df.dtypes
              .collect{ case (dn, dt) => dn }
              .foldLeft(df)((accDF, c) => accDF.withColumn("hasSpecial", col(c).rlike(".*[\\(\\)\\[\\]%+]+.*") || col("hasSpecial")))

result.filter(col("hasSpecial")).show(false)

Вывод:

+---------+----------+--------+----------+
|FirstName|MiddleName|LastName|hasSpecial|
+---------+----------+--------+----------+
|John[    |Ha        |Smith?  |true      |
|Ka%rl    |G         |Hu!     |true      |
|(Harold) |Ju        |Di+     |true      |
|+Tim     |Dgfg      |Ergf+   |true      |
+---------+----------+--------+----------+

Вы также можете сбросить hasSpecial column, если хотите.

0 голосов
/ 27 февраля 2019

Попробуйте это .*[()\[\]%\+,.]+.*

. * Все символы ноль или более раз

[() []% +,.] + Все символы в скобках 1 или более раз

. * Все символы ноль или более раз

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