2017-02-15 72 views
1

我想用火花來處理一個文件,但是我的輸入文件有一條信息遍佈3行的單個「記錄」。spark閱讀slipline的多行記錄

Rec1 Line1 
Rec1 Line2 
Rec1 Line3 
Rec2 Line1 
Rec2 Line2 
Rec2 Line3 

沒有鑰匙鏈接記錄的行,唯一的連接是他們是三行相鄰。除了知道第四行是新記錄的開始之外,沒有記錄分隔符。我看到的所有其他問題都與多行記錄有關,似乎有一些明顯的記錄分隔符,而在這種情況下我沒有任何記錄,我不得不依賴行數。

我首先想到的是使用sliding函數從org.apache.spark.mllib.rdd.RDDFunctions

sc.textFile("myFile.txt").sliding(3,3) 

這接通我的RDD [字符串]進入和RDD [陣列[字符串]]其中在RDD每個元素是從文件3行。

在一些測試中,這看起來像它的工作是得到我想要的結果,但我注意到sliding函數在其評估過程中實際上導致collect。這讓我擔心,它在收集什麼?它是整個數據文件還是其他的東西?我的文件太大而無法將全部內容收集到驅動程序中。

sliding是讀取此文件的最佳方式,還是有更高效的方法來執行此操作?

+0

不能使用rdd.map(_。split(「」))。map(arr =>(arr [0],arr [1]))。groupBy(_._ 2)?這意味着按照空格分隔你的線條,製作一個鍵,值和按鍵分組。 – dumitru

+0

@dumitru groupBy文件沒有密鑰。我也許可以使用'zipWithIndex'來獲得用於分組的密鑰。這也會導致全面洗牌。 – puhlen

回答

1

您看到的collect()調用不會收集所有RDD數據,而是收集分區摘要信息。調用.sliding將使您的文本文件被讀取額外的時間來計算此信息,但不會導致您吹出驅動程序內存。

我通過閱讀Spark 2.0.2中的代碼org.apache.spark.mllib.rdd.SlidingRDD瞭解了這一點。

爲了您的目的,.sliding似乎是最好的選擇。