Spark String split не работает на последних 4 разделителях - PullRequest
0 голосов
/ 04 сентября 2018
Файл

.dat имеет |||| в конце каждой строки. При разделении эти четыре концевые трубы не учитываются.

val splitLine = record.split("\\|").to[ListBuffer]

// I/p: A|B||||||||||C|D||||
// O/p: A,B,,,,,,,,,,C,D

Есть ли способ прочитать файлы данных в Spark?

Что означает четыре канала в конце каждой строки в файле данных?

1 Ответ

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

Использование функции split с -1 - это то, что вам нужно. Соблюдайте ниже со сценариями и без них.

import ss.implicits._
val rd = sc.textFile("path to your file")
       .map(x => x.split("[|]",-1)).map(x => (x(0), x(1), x(2), x(3), x(4), x(5), x(6), x(7), x(8), x(9), x(10), x(11), x(12), x(13), x(14), x(15), x(16))) // `split` function with `-1`

rd.foreach(println)

Выход:

(A,B,,,,,,,,,,C,D,,,,)

Без функции разбиения выдает ошибку. Потому что он не может прочитать последние 4 пустых столбца.

import ss.implicits._
val rd = sc.textFile("path to your file")
       .map(x => x.split("[|]")).map(x => (x(0), x(1), x(2), x(3), x(4), x(5), x(6), x(7), x(8), x(9), x(10), x(11), x(12), x(13), x(14), x(15), x(16))) // `split` function without `-1`

rd.foreach(println)

java.lang.ArrayIndexOutOfBoundsException: 13
...