Есть ли способ разделить на Custom Delimiter в Spark (с Scala) и не читать построчно, чтобы прочитать набор пар ключ-значение? - PullRequest
0 голосов
/ 26 января 2019

У меня есть входной файл .txt в формате.

Record  
ID||1  
Word||ABC   
Language||English   
Count||2   
Record  
ID||2  
Word||DEF  
Language||French  
Count||4 

и так далее.

Я новичок в Apache Spark / Scala.

Я вижу, что есть варианты чтения файла построчно с помощью метода .textFile или чтения всего файла методом .wholeTextFile. Мы также можем читать файлы в формате CSV.

Но, допустим, я хочу прочитать такой файл и создать из него класс case, в котором были бы идентификатор, слово, язык, число членов, как мне это сделать?

1 Ответ

0 голосов
/ 28 января 2019

Предполагая, что ваш формат ввода соответствует (нет случайных пробелов, всегда заканчивается "Запись \ n"), работает следующий код.

Ключ находится в конфигурации hadoop "textinputformat.record.delimiter"

case class Foo(ID : Long, Word : String, Language : String, Count : Long)

.

val conf = new SparkConf()
conf.setMaster("local[*]")
conf.setAppName("stackOverflow")
val sc = new SparkContext(conf)

sc.hadoopConfiguration.set("textinputformat.record.delimiter","Record\n")

val rdd = sc.textFile("C:\\TEMP\\stack.txt")
  .flatMap(record => {
    if (record.isEmpty) None //needed to remove first empty string delimited by "Record\n"
    else {
      val lines = record.split("\n").map(_.split("\\|\\|"))
      //lines.foreach(x=>println(x.mkString(",")))
      Some(Foo(
        lines(0)(1).toLong,
        lines(1)(1),
        lines(2)(1),
        lines(3)(1).toLong
      ))
    }
  })
rdd.foreach(println)

Выход

Foo(2,DEF,French,4)
Foo(1,ABC,English,2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...