2017-01-03 95 views
1

我使用帶鑲木地板的火花。 我希望能夠緩存我們最常使用的列進行過濾,同時保留其他磁盤。 我運行類似:DataFrame的部分垂直緩存

myDataFrame.select("field1").cache 
myDataFrame.select("field1").count 
myDataFrame.select("field1").where($"field1">5).count 
myDataFrame.select("field1", "field2").where($"field1">5).count 

第四行不使用緩存。

任何簡單的解決方案,可以幫助這裏?

回答

0

這種不會緩存的原因是,無論何時對數據幀進行轉換(例如select),實際上都是在創建一個新數據幀。你基本上做的是緩存一個只包含field1的數據框和一個只包含field1的數據框,它大於5(可能你的意思是說field2在這裏,但沒關係)。

在第四行上,您將創建第三個數據幀,該數據幀對原始數據幀沒有血統,只是原始數據幀。

如果您通常要做強濾波(即你得到一個非常少量的元件),你可以做這樣的事情:

cachedDF = myDataFrame.select("field1", "field2", ... "fieldn").cache 
cachedDF.count() 
filteredDF = cachedDF.filter(some strong filter) 
res = myDataFrame.join(broadcast(filteredDF), cond) 

即cachedDF有您篩選上的所有字段,然後您篩選非常強烈然後進行內部連接(cond是所有相關的選定字段或某個id字段),這將提供所有相關數據。

也就是說,在大多數情況下,假設您使用像鑲木地板這樣的文件格式,高速緩存對您無能爲力。

+0

謝謝,實際上我的意思是我在那裏寫了(field1), ,因爲parquet是一種列式格式,我希望獲得緩存,只會對未被緩存的字段進行磁盤訪問。 雖然連接是一個可能的解決方案,但在大多數情況下,這將是非常昂貴的。 – roee