在数据帧中使用dropDuplicates会导致分区号发生更改

Mic*_*ael 3 partitioning apache-spark apache-spark-sql pyspark

我有一个大型数据框,我用800分区创建.

df.rdd.getNumPartitions()
800
Run Code Online (Sandbox Code Playgroud)

当我在数据帧上使用dropDuplicates时,它会将分区更改为默认值200

df = df.dropDuplicates()
df.rdd.getNumPartitions()
200
Run Code Online (Sandbox Code Playgroud)

这种行为会给我带来麻烦,因为它会导致内存不足.

你对修复这个问题有什么建议吗?我尝试将spark.sql.shuffle.partition设置为800,但它不起作用.谢谢

zer*_*323 6

发生这种情况是因为dropDuplicates需要随机播放.如果要获取应设置的特定数量的分区spark.sql.shuffle.partitions(其默认值为200)

df = sc.parallelize([("a", 1)]).toDF()
df.rdd.getNumPartitions()
## 8

df.dropDuplicates().rdd.getNumPartitions()
## 200

sqlContext.setConf("spark.sql.shuffle.partitions", "800")

df.dropDuplicates().rdd.getNumPartitions()
## 800
Run Code Online (Sandbox Code Playgroud)

另一种方法(Spark 1.6+)首先要重新分配:

df.repartition(801, *df.columns).dropDuplicates().rdd.getNumPartitions()
## 801
Run Code Online (Sandbox Code Playgroud)

它稍微灵活但效率较低,因为它不执行本地聚合.

  • 谢谢你。我意识到我的错误在于缺少 spark.sql.shuffle.partition 中的最后一个字符“s”。 (2认同)