2015-08-08 113 views
0

我正在使用Spark Java API。我正在嘗試從目錄讀取文件並過濾出一些行。我的代碼看起來像這樣:用過濾器讀取的火花

final JavaSparkContext jsc = new JavaSparkContext(sparkConf); 
JavaRDD<String> textFile = jsc .textFile("/path/to/some/file"); 

//First Read.... 
JavaRDD<Msg> parsedMessages = textFile.map(....); 

//Then Filter 
JavaRDD<Msg> queryResults = parsedMessages.filter(....) 

是否有一種方法可以將讀取和過濾操作組合到同一個操作中?像用過濾器閱讀的東西?我有一個非常具體的要求,我必須查詢一個非常大的數據集,但我得到一個相對較小的結果集。然後我必須對那些過濾的數據進行一系列轉換和計算。我不想將整個數據集讀入內存,然後將其過濾掉。我沒有那麼多的記憶。我想要做的是在讀取時對其進行過濾,以便只讀取與某些正則表達式匹配的行。這可能與Spark有關嗎?

回答

1

至少與SparkContext.textFile沒有這樣的選項,但它不應該是一個問題。沒有要求所有數據必須在除了收集驅動程序之外的任何點駐留在內存中。數據以區塊形式讀取,您可以使用minPartitions參數減小單個拆分的大小。

我的建議是儘快使用正常的filter操作,並且persist會導致RDD避免重新計算。

2

Spark並不會完全按照您編寫代碼的方式執行代碼 - 它會通過優化器。寫入代碼的方式(讀取,映射和過濾 - 兩者之間沒有混洗動作)spark會在讀取每行時實際執行讀取,映射轉換和過濾器 - 即它不需要所有數據在內存中