我在调解sqlContext.sql("set spark.sql.shuffle.partitions=n")
之间的差异(如果存在)和使用df.repartition(n)
重新划分Spark DataFrame方面遇到一些困难。
Spark文档表明set spark.sql.shuffle.partitions=n
配置了在对数据进行混排时使用的分区数,而df.repartition
似乎返回了一个按指定键数划分的新DataFrame。
为使这个问题更清楚,这是一个玩具示例,说明我我相信df.reparition
和spark.sql.shuffle.partitions
如何工作:
假设我们有一个DataFrame,如下所示:
ID | Val
--------
A | 1
A | 2
A | 5
A | 7
B | 9
B | 3
C | 2
sqlContext.sql("set spark.sql.shuffle.partitions=3")
,然后再进行df.repartition($"ID")
,我希望将数据重新分区为3个分区,其中一个分区保存ID为“ A”的所有行的3个值,另一个保存2个值。所有ID为“ B”的行的val,最后一个分区为ID为“ C”的所有行的val。我的理解在这里吗?一般来说,我的问题是:
我正在尝试优化数据帧的分区,以避免
倾斜,但要使每个分区都拥有相同的键
尽可能的信息。如何使用set
spark.sql.shuffle.partitions
和df.repartiton
来实现?
是否存在链接
在set spark.sql.shuffle.partitions
和df.repartition
之间?如果
那么,那是什么链接?
谢谢!
答案 0 :(得分:0)
我希望将数据重新划分为3个分区,其中一个分区保存ID为“ A”的所有行的3个值,另一个分区保存ID为“ B”的所有行的2个值,最后一个分区保存ID为“ C”的所有行中有1个值。
否
5个混洗分区,按ID排序DF:在这种情况下,我仍然希望每个分区仅保存标记有相同ID的数据。也就是说,在同一分区内不会混合使用具有不同ID的行。
没有。
这不是分区的工作方式。 Partitioners
将值映射到分区,但是一般情况下映射不是唯一的(您可以查看How does HashPartitioner work?以获得详细说明)。
set spark.sql.shuffle.partitions和df.repartition之间是否存在链接?如果是这样,那是什么链接?
确实存在。如果您df.repartition
,但未提供分区数,则使用spark.sql.shuffle.partitions
。