【发布时间】:2016-10-11 15:43:57
【问题描述】:
假设存在类似如下的元组RDD:
(key1, 1)
(key3, 9)
(key2, 3)
(key1, 4)
(key1, 5)
(key3, 2)
(key2, 7)
...
计算每个键对应的统计信息的最有效(理想情况下是分布式)方法是什么? (目前,我特别希望计算标准偏差/方差。)据我了解,我的选择相当于:
-
使用
colStatsfunction in MLLib: 如果认为需要进行其他统计计算,此方法的优点是可以轻松适应以后使用其他mllib.stat函数。但是,它在包含每列数据的Vector的 RDD 上运行,因此据我了解,这种方法需要在单个节点上收集每个键的完整值集,这似乎并不理想对于大型数据集。 SparkVector是否总是暗示Vector中的数据驻留在本地,在单个节点上? -
先执行
groupByKey,然后执行stats: 可能需要大量随机播放,as a result of thegroupByKeyoperation。 -
执行
aggregateByKey,初始化一个新的StatCounter,并使用StatCounter::merge作为序列和组合函数:这是recommended by this StackOverflow answer的方法,避免了选项2中的groupByKey。但是,我无法在 PySpark 中找到关于StatCounter的良好文档。
我喜欢选项 1,因为它使代码更具可扩展性,因为它可以使用具有类似合约的其他 MLLib 函数轻松适应更复杂的计算,但如果 Vector 输入固有地要求在本地收集数据集,那么它限制了代码可以有效操作的数据大小。在其他两个之间,选项 3 看起来更有效,因为它避免了 groupByKey,但我希望确认确实如此。
还有其他我没有考虑过的选择吗? (我目前使用的是 Python + PySpark,但如果存在语言差异,我也愿意接受 Java/Scala 中的解决方案。)
【问题讨论】:
标签: apache-spark pyspark distributed-computing rdd apache-spark-mllib