Я использую Spark 2.1.1 и Scala 2.11.8 в искровой оболочке.
Мой набор входных данных выглядит примерно так:
2017-06-18 00:00:00 , 1497769200 , z287570731_serv80i:7:175 , 5:Re
2017-06-18 00:00:00 , 1497769200 , p286274731_serv80i:6:100 , 138
2017-06-18 00:00:00 , 1497769200 , t219420679_serv37i:2:50 , 5
2017-06-18 00:00:00 , 1497769200 , v290380588_serv81i:12:800 , 144:Jo
2017-06-18 00:00:00 , 1497769200 , z292902510_serv83i:4:45 , 5:Re
2017-06-18 00:00:00 , 1497769200 , v205454093_serv75i:5:70 , 50:AK
Он сохраняется в виде файла CSV, который читается с помощью sc.textFile("input path")
.
После нескольких преобразований это вывод RDD, который у меня есть:
(String, String) = ("Re ",7)
Я получаю это, выполняя
val tid = read_file.map { line =>
val arr = line.split(",")
(arr(3).split(":")(1), arr(2).split(":")(1))
}
Мой ввод RDD:
( z287570731_serv80i:7:175 , 5:Re )
( p286274731_serv80i:6:100 , 138 )
( t219420679_serv37i:2:50 , 5 )
( v290380588_serv81i:12:800 , 144:Jo )
( z292902510_serv83i:4:45 , 5:Re )
Как можно заметить, в первом столбце записи 2 у меня есть
5:Re
из которых я получаю вывод
("Re ",7)
Однако, когда я дохожу до второй строки, в соответствии с форматом столбец 2 равен 138, который должен быть
138:null
но дает ArrayIndexOutOfBoundsException при выполнении
tid.collect()
Как я могу исправить это, чтобы нуль отображался со 138 и 5 для второй и третьей строк соответственно? Я пытался сделать это следующим образом:
tid.filter(x => x._1 != null )