我看到了对使用 Spark 的人的一般建议(以我为例,使用 Scala) 是为了避免任何将所有数据从执行器获取到驱动程序的操作(收集、计数、求和等)。 但是,当我尝试使用 Spark 统计库时 http://spark.apache.org/docs/2.2.0/ml-statistics.html 我发现相关矩阵和 ChiSquareTest 方法 期望从 array\seq 获得数组或矩阵作为它们的参数,因此我不 看看我如何避免收集数据框(以及我假设的更多操作 如果我想使用这个函数,使其成为向量而不是行类型。将不胜感激任何帮助。
最佳答案
- 在您的示例中,
Correlation.corr
和ChiSquareTest.test
都接受数据帧,因此您无需在将数据传递给这些函数之前收集数据。您必须在驱动程序上收集这些函数的结果,但这不会导致任何问题,因为输出大小应该比初始数据集小得多,并且它应该很容易适合驱动程序的内存。 - 对于您在有关
groupBy
/joins
的评论中提出的问题 - 这些都是“昂贵的”,但出于不同的原因。分组和联接会导致数据洗牌 - 因此,您的工作人员需要通过网络发送大量数据,这比本地数据处理需要更多的时间。不过,如果您必须这样做 - 这样做也可以,只是要注意性能影响。
不建议在完整数据集上使用 collect
方法,因为它可能会导致驱动程序上出现 OOM 错误(想象一下,您有 50 Gb 数据集,分布在集群上,现在你正在单个节点上收集它),但是如果你已经处理了你的数据,并且你知道,会有一些合理数量的行 - 这样做是非常安全的。从内存的角度来看,count
根本不应该成为问题,因为它只是返回数据集中的行数,而不是将所有行发送到驱动程序节点。
关于scala - Spark 避免收集尽可能多的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62877734/