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,但它不起作用.谢谢
发生这种情况是因为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)
它稍微灵活但效率较低,因为它不执行本地聚合.
| 归档时间: |
|
| 查看次数: |
4066 次 |
| 最近记录: |