2017-08-30 62 views
2

我使用Spark與Java連接器來處理我的數據。Spark Dataframe的計數替代品()API

我需要處理數據的基本操作之一是計算數據幀中的記錄數(行)。

我試過df.count()但執行時間非常慢(2-3-40M記錄爲30-40秒)。

另外,由於系統的要求,我不想使用df.rdd().countApprox() API,因爲我們需要確切的計數值。

有人能給我一個建議,任何替代方法都會返回與df.count()完全相同的結果,並且執行時間更快嗎?

非常感謝您的回覆。

+1

我不認爲有任何更好的選擇參考。但是,如果您對數據幀執行多個操作,則可以考慮使用'cache()',請參閱https://stackoverflow.com/questions/45749580/same-set-of-tasks-are-repeated-in-multiple-stages -a-spark-job/45749730#45749730 – Shaido

+0

其實我們大多隻有一個計數動作,在不同的數據集中執行,我們從不同的查詢中獲得。不過謝謝你,Shaido – tuancoltech

+1

我相信在對它執行操作(而不是轉換)之前,數據並未實際加載。因此,運行時間可能部分歸因於從磁盤或數據庫讀取數據。 – Shaido

回答

3
df.cache 
df.count 

由於第一次執行計數期間會緩存,但在隨後的計數中會爲您提供良好的性能,因此它第一次會很慢。

利用df.cache取決於用例。

+0

據我所知,如果我們在同一個數據集上調用多個動作,您的方法會更快,正如Shaido從上面的評論中指出的那樣。但是,我們只對每個數據集有一個操作。之後,我們會重新進行一次查詢以獲取新的數據集,然後調用另一個計數操作。所以我恐怕這種方法對我們的情況不會有太大的幫助。 – tuancoltech

1

計數是非常快的。您需要查看一些其他操作,即數據加載和轉換,以生成您正在計算的數據框。這是放慢你而不是計數本身的部分。

如果您可以減少您加載或刪除不影響計數的任何轉換的數據量,則可以加快速度。如果這不是您可能選擇的選項。更有效地編寫你的轉換。儘管不可能說出什麼是瓶頸,但不知道你的轉變。

+0

謝謝puhlen。就像我上面提到的那樣,我將數據加載到Spark數據框中以進行更多的查詢和計數,這是不必要的。現在使用aerospike客戶端來完成這項工作,我認爲這正是我正在尋找的。 – tuancoltech