Spark Scala Regex -> Создание нескольких столбцов на основе регулярных выражений - PullRequest
0 голосов
/ 02 сентября 2018

Допустим, у меня есть текстовый файл с такими данными, как ...

my "sample data set" kdf/dfjl/ looks like this

У меня есть регулярное выражение, которое может объединить все это в группы. Значения, которые я хотел бы поместить в мои столбцы, будут такими:

желаемые значения из групп

Я бы хотел, чтобы каждая группа стала отдельным столбцом в rdd

val pattern = """(\S+) "([\S\s]+)\" (\S+) (\S+) (\S+) (\S+)""".r

var myrdd = sc.textFile("my/data/set.txt")
myrdd.map(line => pattern.findAllIn(line))

Я пробовал несколько разных методов для выведения совпадений из регулярного выражения в разные столбцы, например toArray, toSeq, но еще даже не приблизился.

Я знаю, как данные существуют в матчах ....

val answer = pattern.findAllIn(line).matchData
for(m <- answer){
  for(e <- m.subgroups){
    println(e)
  }
}

Это те, кого я ищу ... но мне не повезло, что эти данные были разделены в моем СДР.

Спасибо

1 Ответ

0 голосов
/ 02 сентября 2018

Я бы предложил использовать for-comprehension вместо цикла for для создания списка извлеченных групп в каждой строке и отображения элементов списка в отдельные столбцы:

val rdd = sc.textFile("/path/to/textfile")

val pattern = """(\S+) "([\S\s]+)\" (\S+) (\S+) (\S+) (\S+)""".r

rdd.map{ line =>
    ( for {
        m <- pattern.findAllIn(line).matchData
        g <- m.subgroups
      } yield(g)
    ).toList
  }.
  map(l => (l(0), l(1), l(2), l(3), l(4), l(5)))
// org.apache.spark.rdd.RDD[(String, String, String, String, String, String)] = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...