假設元組的RDD存在類似如下:Spark RDD:如何最有效地計算統計信息?
(key1, 1)
(key3, 9)
(key2, 3)
(key1, 4)
(key1, 5)
(key3, 2)
(key2, 7)
...
什麼是計算對應於每個關鍵統計數據的最有效的(和,理想情況下,分佈式)的方式? (此刻,我要找計算標準偏差/方差,尤其如此。)據我所知,我的選擇權相當於:
- 使用
colStats
function in MLLib:此方法具有易於適應優勢如果認爲有必要進行其他統計計算,則可以在以後使用其他mllib.stat
函數。然而,它運行在包含每列數據的RDDVector
上,據我瞭解,這種方法需要在單個節點上收集每個密鑰的全部值,這對於大型企業而言似乎並不理想數據集。 SparkVector
是否總是暗示Vector
中的數據本地駐留在單個節點上? - 執行
groupByKey
,然後stats
:可能洗牌重,as a result of thegroupByKey
operation。 - 執行
aggregateByKey
,初始化新StatCounter
,並使用StatCounter::merge
的順序和組合功能:這是方法recommended by this StackOverflow answer,避免從選項2.然而groupByKey
,我一直沒能找到好的文檔PySpark中的StatCounter
。
我喜歡選項1,因爲它使代碼更可擴展的,因爲它可以很容易地適應使用具有類似合同其他MLLib功能更復雜的計算,但如果Vector
輸入固有地要求該數據集在本地收集那麼它會限制代碼可以有效運行的數據大小。在另外兩個之間,選項3 看起來效率更高,因爲它避免了groupByKey
,但我希望確認是這種情況。
有沒有其他的選擇我沒有考慮過? (我目前使用Python + PySpark,但如果語言有差異,我也可以使用Java/Scala解決方案。)
可能重複[在單個數據中發現帶有pyspark的最小/最大值](http://stackoverflow.com/questions/36559809/finding-min-max-with-pyspark-in-single-pass-over -數據) –