当减少分区数时,可以使用coalesce
,这很好,因为它不会导致混乱并且似乎立即起作用(不需要额外的工作阶段)。 / p>
我有时会反其道而行,但是repartition
引发了一场洗牌。我想几个月前我实际上通过CoalescedRDD
使用balanceSlack = 1.0
来实现这一点 - 所以会发生什么呢?它会分割一个分区,以便生成的分区位置在同一个节点上(所以很小)净IO)。
这种功能在Hadoop中是自动的,只需调整分割大小即可。除非减少分区数量,否则它似乎不会在Spark中以这种方式工作。我认为解决方案可能是编写一个自定义分区器以及我们定义getPreferredLocations
的自定义RDD ......但我认为这是一个非常简单和常见的事情,确实必须有一个直接的做法它?
尝试过的事情:
.set("spark.default.parallelism", partitions)
在我的SparkConf
上,当我在阅读镶木地板的情况下,我已尝试sqlContext.sql("set spark.sql.shuffle.partitions= ...
,这在1.0.0上导致错误并且不是我想要的,我想要在所有类型的工作中改变分区号,而不仅仅是随机播放。
答案 0 :(得分:6)
留意这个空间
https://issues.apache.org/jira/browse/SPARK-5997
最终将实现这种非常简单明显的功能 - 我想它们在完成Dataset
s中所有不必要的功能之后就会实现。
答案 1 :(得分:0)
我并不完全明白你的意思。你的意思是你现在有5个分区,但是在下一个操作之后你想要将数据分配到10个?因为有10个,但仍然使用5没有多大意义......将数据发送到新分区的过程必须在某个时候发生。
在执行coalesce
时,您可以删除未分配的分区,例如:如果您最初有100个,但是在reduceByKey之后有10个(因为只有10个键),您可以设置{{1 }}
如果您希望该过程采用其他方式,您可以强行进行某种分区:
coalesce
我不确定这是你在找什么,但希望如此。
答案 2 :(得分:-1)
您知道pyspark使用某种“惰性”运行方式。它仅在需要执行某些操作时(例如“ df.count()”或“ df.show()”)进行计算。因此,您可以在这些操作之间定义一个随机分配分区。 / p>
您可以写:
sparkSession.sqlContext().sql("set spark.sql.shuffle.partitions=100")
# you spark code here with some transformation and at least one action
df = df.withColumn("sum", sum(df.A).over(your_window_function))
df.count() # your action
df = df.filter(df.B <10)
df = df.count()
sparkSession.sqlContext().sql("set spark.sql.shuffle.partitions=10")
# you reduce the number of partition because you know you will have a lot
# less data
df = df.withColumn("max", max(df.A).over(your_other_window_function))
df.count() # your action