Spark: создание столбца на основе сопоставления с регулярным выражением без извлечения - PullRequest
0 голосов
/ 27 марта 2019

У меня огромный список файлов:

file.txt
file.txt.tar.gz
file.txt.tgz
core123165
core123165.bak
file.jpg
file.jpg.bak
file.png
file.png.tgz
...

Есть много случаев, когда я не могу перечислить их все. Я хотел бы вывести тип файла на основе там расширение или имя файла.
Проблема в том, что я хотел бы игнорировать набор расширений, таких как tgz или bak. Пока что моя идея такова:

val DF = spark.createDF(
  List(("file.txt"),("file.txt.tar.gz"),("file.txt.tgz"),
      ("core123165"),("core123165.bak"),("file.jpg"),
      ("file.jpg.bak"),("file.png"),("file.png.tgz")),
  List(("name", StringType, true))
  )

DF.withColumn("type",
when($"name".endsWith(".txt"), "text").
when($"name".endsWith(".txt.tar.gz"), "text").
when($"name".endsWith(".txt.tgz"), "text").
when($"name".endsWith(".txt.bz2"), "text").
when[...]
)

И так далее, однако мне нужно будет использовать regex для идентификации файла ядра с чем-то вроде ^core[0-9]{6}$ и хотел бы использовать regex для более простой идентификации другого типа, используя что-то вроде ^.+\.txt$|^.+\.txt.zip$|^.+\.txt.gz$.
Поэтому мой вопрос заключается в том, существует ли метод Spark / Scala, применимый к столбцу, чтобы сделать что-то вроде:

val DF = spark.createDF(
  List(("file.txt"),("file.txt.tar.gz"),("file.txt.tgz"),
      ("core123165"),("core123165.bak"),("file.jpg"),
      ("file.jpg.bak"),("file.png"),("file.png.tgz")),
  List(("name", StringType, true))
  )

DF.withColumn("type",
when($"name".matches("^.+\.txt$|^.+\.txt.zip$|^.+\.txt.gz$|^.+\.txt.bz2$^.+\.txt.tar.gz$^.+\.txt.tgz$"), "text").
when($"name".matches("^core[0-9]{6}$|^core[0-9]{6}\.bak$"), "core")
[...]
)

Это значительно улучшило бы мое лечение.

PS: я знаю, что могу еще больше разложить свое регулярное выражение, используя ^.+\.txt(\.bak|\.tgz|\.bz2)$, но это был только пример.

1 Ответ

1 голос
/ 27 марта 2019

rlike - это функция, которую вы ищете.

Кроме того, вам необходимо избежать обратной косой черты \ с другой обратной косой чертой: \\.Это будет выглядеть так:

df.withColumn("type",
   when('name rlike "^.+\\.txt$|^.+\\.txt.zip$", "text").otherwise("other"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...