取消
顯示的結果
而不是尋找
你的意思是:

如何用換行符解析文件,逃脫\和不引用

XinZodl
新的貢獻者三世

這就跟你問聲好!

我麵臨一個問題,當讀取和解析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解析器設置轉義字符\(這應該是默認情況下),但這並不工作。我應該以某種方式擴展解析器和編輯,創建自己的解析器?這將是最好的解決方案?

謝謝!

1接受解決方案

接受的解決方案

XinZodl
新的貢獻者三世

解決方案是“sparkContext.wholeTextFiles”

在原帖子查看解決方案

3回複3

User16857281974
貢獻者

火花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(文件名)

XinZodl
新的貢獻者三世

解決方案是“sparkContext.wholeTextFiles”

恢複使用抽樣API沒有錯,但一個謹慎小心的大小的文件。因為每個文件閱讀完全是作為一個記錄,大文件將導致明顯的性能問題如果不崩潰的執行人。引用API文檔:

  • 小文件是首選,大文件也是允許的,但可能會導致糟糕的性能。
歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map