衆所周知,csv文件默認以逗號“,”分割數據,那麼在scala命令行裏查詢的數據:
可以看見,字段裏就包含了逗號“,”,那接下來切割的時候,這本應該作爲一個整體的字段會以逗號“,”爲界限進行切割爲多個字段。
現在來看看這裏的_c0
字段一共有多少行記錄。
記住這個數字:60351行
寫scala代碼讀取csv文件並以逗號爲分隔符來分割字段
val lineRDD = sc.textFile("xxxx/xxx.csv").map(_.split(","))
這裏只讀取了_c0
一個字段,否則會報數組下標越界的異常,至於爲什麼請往下看。
接着還是查詢這個字段的有多少行
很顯然,60364>60351
這就是把一個字段裏本來就有的逗號當成了分隔符,導致一個字段切割爲兩個甚至多個字段,增加了行數。
所以如果csv文件的第一行本來有n個字段,但某個字段裏自帶有逗號,那就會切割爲n+1個字段。自然就會報數組下標越界的異常了
那就把切割規則改一下,只對引號外面的逗號進行分割,對引號內的不分割
就是修改split()
方法裏的參數爲:
split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"))