Spark String split在最后4个定界符上不起作用

时间:2018-09-04 07:42:48

标签: scala file apache-spark

.dat文件的每一行末尾都有||||。在拆分时,不考虑这四个末端管道。

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

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

有没有办法在Spark中读取dat文件?

dat文件中每行末尾的四个管道是什么意思?

1 个答案:

答案 0 :(得分:0)

您需要将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