我看到,对于任何使用spark的人(在我使用scala的例子中)的一般建议是避免任何将所有数据从执行者获取到驱动程序的操作(collect、count、sum等)。然而,当我尝试使用spark统计库时http://spark.apache.org/docs/2.2.0/ml-statistics.html 我发现相关矩阵和chisquaretest方法的参数是array或array\ seq得到的矩阵,因此,如果我想使用这个函数,我不知道如何避免对dataframe进行collect(以及我假设的更多操作,使其成为vectors而不是row类型)。谢谢你的帮助。
1条答案
按热度按时间oiopk7p51#
在你的例子中,两者
Correlation.corr
以及ChiSquareTest.test
正在接受Dataframe,因此在将数据传递给这些函数之前不需要收集数据。这些函数的结果必须在驱动程序上收集,但这不会引起任何问题,因为输出大小应该比初始数据集小得多,并且应该很容易放入驱动程序的内存中。关于你在评论中的问题
groupBy
/joins
-这些是“昂贵的”,但原因不同。分组和联接会导致数据洗牌—因此,您的工作人员需要通过网络发送大量数据,这比本地数据处理要花费更多的时间。尽管如此,如果您必须这样做,也可以这样做,只需注意性能影响。collect
方法不建议在完整的数据集上使用,因为它可能会导致驱动程序出现oom错误(想象一下,您有50 gb的数据集,分布在一个集群上,现在在单个节点上收集),但是如果您已经处理了数据,并且您知道,会有一些合理数量的行,那么这样做是非常安全的。count
从内存的Angular 看,这根本不是问题,因为它只返回数据集中的行数,而不是将所有行都发送到驱动程序节点。