Сплит с неправильным рисунком (регулярное выражение) SCALA - PullRequest
1 голос
/ 14 мая 2019

У меня есть данные textFile, которые выглядят как

28.225.37.170 - - [14/May/2019:00:00:05 +0000] "GET xxxxxx "-" "yyyyyy"
80.156.48.65 - - [14/May/2019:00:00:10 +0000] "GET xxxxxxx "-" "yyyyyy"
....

Я хочу, чтобы RDD выглядело так

(28.225.37.170 ,  14/May/2019:00:00:05 +0000 , xxxxxx , yyyyyy ) 
(80.156.48.65 ,  14/May/2019:00:00:10  +0000 ,  xxxxxx , yyyyyy ) 

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

val reg: scala.util.matching.Regex = """?????""".r  // ????? any suggestions ?
rdd.map( lines => lines.split(reg) ) 

1 Ответ

1 голос
/ 14 мая 2019

Почему бы не сопоставить шаблон с регулярным выражением? Если ваши строки представляют определенное количество элементов для извлечения и различные разделители, я мог бы быть лучше:

val l1 = """28.225.37.170 - - [14/May/2019:00:00:05 +0000] "GET xxxxxx "-" "yyyyyy""""
val l2 = """80.156.48.65 - - [14/May/2019:00:00:10 +0000] "GET xxxxxxx "-" "yyyyyy""""

val reg = """(.*) - - \[(.*)\] "GET (.*) "-" "(.*)"""".r

def splitMyLine(line:String) = line match { case reg(a,b,c,d) => "line: \n" +Seq(a,b,c,d).map(s => s" __ data: $s").mkString("\n") }

Seq(l1, l2).foreach(l => println(splitMyLine(l)))

дает:

line: 
 __ data: 28.225.37.170
 __ data: 14/May/2019:00:00:05 +0000
 __ data: xxxxxx
 __ data: yyyyyy
line: 
 __ data: 80.156.48.65
 __ data: 14/May/2019:00:00:10 +0000
 __ data: xxxxxxx
 __ data: yyyyyy

Вы можете просто определить свою функцию разделения следующим образом:

def splitMyLine(line:String): Seq[String] = line match {
    case reg(a,b,c,d) => Seq(a,b,c,d)
}

Надеюсь, это поможет.

...