Apache spark 增加或减少聚合的分区?

Apache spark 增加或减少聚合的分区?,apache-spark,pyspark,spark-dataframe,Apache Spark,Pyspark,Spark Dataframe,我不确定在执行聚合操作时是否应该增加或减少分区数。假设我使用的是pyspark数据帧pyspark 1.6.1 我知道行转换通常需要更多的分区。而将数据保存到磁盘通常需要fewere分区 但是,对于聚合,我不清楚在pyspark中要做什么 增加分区数量的理由:由于我们必须对数据进行混洗以进行聚合,因此您希望减少数据的混洗,从而增加分区的数量,以减小分区的大小 减少分区数量的理由:在每个分区上进行收集和计算需要大量开销。因此,过多的分区将导致过多的开销,pyspark作业可能会超时 是哪一个 资料

我不确定在执行聚合操作时是否应该增加或减少分区数。假设我使用的是pyspark数据帧<代码>pyspark 1.6.1

我知道行转换通常需要更多的分区。而将数据保存到磁盘通常需要fewere分区

但是,对于聚合,我不清楚在
pyspark
中要做什么

增加分区数量的理由:由于我们必须对数据进行混洗以进行聚合,因此您希望减少数据的混洗,从而增加分区的数量,以减小分区的大小

减少分区数量的理由:在每个分区上进行收集和计算需要大量开销。因此,过多的分区将导致过多的开销,pyspark作业可能会超时

是哪一个

资料来源:

这要视情况而定

根据问题使用用户定义的分区会使某些事情变得更容易,而另一些事情则更难。但这就是我的经验

设置更多分区 当出现一个聚合函数,然后是一个丰富的数据时,我使用了这种方法。默认数据分区发生了什么。我得到了一个OOM错误和其他一些问题,由于这一点。因此,我的数据浓缩聚合使用的内存超过了我的员工所能支持的。解决方案是增加该步骤的分区数量,并解决了我的问题,但由于洗牌和其他原因,它需要更多的执行时间

设置更少的分区 这个案例是关于洗牌时间的,我有一个Cassandra和spark集群,使用datasax连接器,我试图从Cassandra读取一些数据,其中包含200个默认分区。但是所有的数据都在同一台机器上,当我做一个简单的聚合时,这就产生了大量的混乱。所以我减少了分区,减少了洗牌时间

结论
你需要了解你的数据和你想做什么。数据处理没有什么神奇之处。你需要检查你需要做什么以及如何做。它将有助于选择要做什么,或者增加或减少分区。

您能告诉我更多关于“设置更多分区”的情况吗?你所说的“丰富数据”是什么意思?那么,丰富数据就是这样。你有一个数据集,它有一个日期,比如1988-10-10,但是你需要更多的信息,所以你需要得到一周中的哪一天,以及其他一些东西,所以你需要向你自己的数据中添加更多的数据来丰富它。关于添加更多分区,您可以使用很少的东西,您可以设置
repartition
函数,或者在
reduceByKey
过程中,您可以设置分区的数量,或者您可以在这里找到设置默认并行度的配置
spark.default.parallelism
,因此它基本上类似于pyspark中的
with column
。这被认为是数据丰富的吗?是的,每一个添加到任何类型的数据中的信息,或者从其他地方检索到一些“丰富”你的数据的信息都是考虑数据的丰富。一般来说,似乎增加分区的数量是更好的。