這就跟你問聲好!
我麵臨一個問題,當讀取和解析CSV文件。一些記錄有一個換行符號,\“逃脫”,記錄沒有被引用。該文件可能看起來像這樣:
Line1field1; Line1field2.1 \
Line1field2.2; Line1field3;
Line2FIeld1; Line2field2 Line2field3;
我試著讀它使用sc.textFile (“file.csv”)和使用sqlContext.read.format(“…磚…”).option .load(“逃避/分隔符/…”)(“file.csv”)
不過沒關係我怎麼讀,一個記錄/線/行時創建si達成“\ \ n”。而不是2記錄前麵的文件,我讓三:
(Line1field1 Line1field2.1, null)(3個字段)
[Line1field。2 Line1field3 null]字段(3)
[Line2FIeld1, Line2field2 Line2field3;](3字段)
預期的結果是:
[Line1field1 Line1field2.1 Line1field。2,Line1field3]字段(3)
[Line2FIeld1, Line2field2 Line2field3](3字段)
(換行符號是如何保存的記錄並不重要,主要問題有正確的記錄集/線)
任何想法如何能夠這樣做?無需修改原始文件,最好沒有任何職位/ re處理(例如讀取文件和過濾任何線比預期較低數量的字段和連接可能是一個解決方案,但不是最優)
我希望是使用databrick csv解析器設置轉義字符\(這應該是默認情況下),但這並不工作。我應該以某種方式擴展解析器和編輯,創建自己的解析器?這將是最好的解決方案?
謝謝!
火花2.2.0增加了支持多行解析CSV文件就是我知道你描述。然而,沒有引號,解析器不會知道如何區分一個新行中一個字段記錄的結束和一個新行。
為了確保斷言是真的,我進行了以下測試讀正確的CSV文件:
val jsonLines = " " " " Line1field1”;“Line1field2.1 \ Line1field2.2”;“Line1field3”;“Line2FIeld1”;“Line2field2”;“Line2field3”;“”“< br > val文件名= " / tmp /等等。csv”dbutils.fs。(文件名、jsonLines真正)< br > < br > val df =火花。讀.option (“9”、“;”) .option(“引用”、“\”).option .option(“多行”、“true”) (“inferSchema”,“真正的”). csv(文件名)
但以下測試不工作:
val jsonLines = " " Line1field1; Line1field2.1 \ Line1field2.2 Line1field3;Line2FIeld1; Line2field2 Line2field3;“”“val文件名= " / tmp / jdp / q12593。json”dbutils.fs。把(文件名,jsonLines,真)val df =火花。讀.option (“9”、“;”) .option (“", " ") .option .option(“多行”、“true”) (“inferSchema”,“真正的”). csv(文件名)
恢複使用抽樣API沒有錯,但一個謹慎小心的大小的文件。因為每個文件閱讀完全是作為一個記錄,大文件將導致明顯的性能問題如果不崩潰的執行人。引用API文檔: