我看到对使用spark的任何人(在我的Scala中为例)的一般建议是避免采取任何将所有数据从执行者获取到驱动程序的行为(收集,计数,总和等)。但是,当我尝试使用火花统计库http://spark.apache.org/docs/2.2.0/ml-statistics.html时,我发现相关矩阵和ChiSquareTest方法期望使用数组或从array \ seq获得的矩阵作为它们的参数,因此,如果要使用此功能,我看不到如何避免收集到数据帧(以及我认为要使其成为Vector而不是Row类型的更多操作)。将不胜感激。
Correlation.corr
和ChiSquareTest.test
都接受数据帧,因此您无需在将数据传递给这些函数之前收集数据。您必须在驱动程序上收集这些函数的结果,但这不会引起任何问题,因为输出大小应该比初始数据集小得多,并且应该容易地放入驱动程序的内存中。groupBy
//的注释中,您的问题joins
是“昂贵的”,但出于不同的原因。分组和联接会导致数据混排-因此,您的工作人员需要通过网络发送大量数据,这比本地数据处理花费更多的时间。不过,尽管如此,如果您必须执行此操作-可以这样做,只是要意识到性能的影响。collect
不建议在完整的数据集上使用该方法,因为该方法可能会导致驱动程序出现OOM错误(想象一下,您有50 Gb数据集,分布在群集上,现在您将其收集在单个节点上),但是,如果您已经处理了数据,并且知道行的数量是合理的,那么这样做是非常安全的。count
从内存的角度来看,这根本不是问题,因为它只是返回数据集中的行数,而不是将所有行发送到驱动程序节点。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句