scala - Spark 避免收集尽可能多的

标签 scala dataframe apache-spark dataset

我看到了对使用 Spark 的人的一般建议(以我为例,使用 Scala) 是为了避免任何将所有数据从执行器获取到驱动程序的操作(收集、计数、求和等)。 但是,当我尝试使用 Spark 统计库时 http://spark.apache.org/docs/2.2.0/ml-statistics.html 我发现相关矩阵和 ChiSquareTest 方法 期望从 array\seq 获得数组或矩阵作为它们的参数,因此我不 看看我如何避免收集数据框(以及我假设的更多操作 如果我想使用这个函数,使其成为向量而不是行类型。将不胜感激任何帮助。

最佳答案

  1. 在您的示例中,Correlation.corrChiSquareTest.test 都接受数据帧,因此您无需在将数据传递给这些函数之前收集数据。您必须在驱动程序上收集这些函数的结果,但这不会导致任何问题,因为输出大小应该比初始数据集小得多,并且它应该很容易适合驱动程序的内存。
  2. 对于您在有关 groupBy/joins 的评论中提出的问题 - 这些都是“昂贵的”,但出于不同的原因。分组和联接会导致数据洗牌 - 因此,您的工作人员需要通过网络发送大量数据,这比本地数据处理需要更多的时间。不过,如果您必须这样做 - 这样做也可以,只是要注意性能影响。
  3. 不建议在完整数据集上使用
  4. collect 方法,因为它可能会导致驱动程序上出现 OOM 错误(想象一下,您有 50 Gb 数据集,分布在集群上,现在你正在单个节点上收集它),但是如果你已经处理了你的数据,并且你知道,会有一些合理数量的行 - 这样做是非常安全的。从内存的角度来看,count 根本不应该成为问题,因为它只是返回数据集中的行数,而不是将所有行发送到驱动程序节点。

关于scala - Spark 避免收集尽可能多的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62877734/

相关文章:

scala - Spark中的FP增长模型

使用 play dist 出现 java.io.FileNotFoundException

scala - 如何从 scala TypeTag 获取通用简单类名?

python - Pyspark 从现有数组列创建一定长度的数组列

java - 无法使用 Scala 从 Cassandra DB 的原始数据类型映射读取数据

python - 将一列列表拆分为不同的列时出错

R-使用ddply对数据框中的列子集进行操作

python - 如何使用将数据框显示为表格的常量 url 构建静态网站

hadoop - Spark RDD问题

scala - 在完成 map 操作之前,Spark,mapPartitions,网络连接已关闭