Apache spark Spark-在这种情况下,何时发生重新分区?
我需要在每个前缀中输出一个唯一的文件,因此代码是这样写的Apache spark Spark-在这种情况下,何时发生重新分区?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我需要在每个前缀中输出一个唯一的文件,因此代码是这样写的ds.repartition(1).write.partitionBy(“前缀”).mode(SaveMode.Overwrite).csv(输出) 在代码没有添加重新分区之前,每个前缀将有数千个文件,并且任务可以在2小时内完成。添加重新分区后,每个前缀将有一个文件,并且任务将执行7小时以上。在什么阶段执行重新分区?我是否优雅地使用了它?如果要使用前缀作为分区列,则需要运行 spark.sql("set hive.exec.dyn
ds.repartition(1).write.partitionBy(“前缀”).mode(SaveMode.Overwrite).csv(输出)
在代码没有添加重新分区之前,每个前缀将有数千个文件,并且任务可以在2小时内完成。添加重新分区后,每个前缀将有一个文件,并且任务将执行7小时以上。在什么阶段执行重新分区?我是否优雅地使用了它?如果要使用前缀作为分区列,则需要运行
spark.sql("set hive.exec.dynamic.partition=true")
spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")
您可以使用合并(1)而不是重新分区(1),因为在这种情况下,合并不洗牌,重新分区有洗牌,分区是一个,然后只有一个任务来处理所有数据。因此,它需要7个小时。每当您进行重新分区时,它都会进行一次完整的洗牌,并尽可能均匀地分布数据。 在您的例子中,当您执行ds.repartition(1)时,它会洗牌所有数据,并将所有数据放在一个工作节点上的单个分区中 现在,当您执行写操作时,只有一个工作节点/执行器在按前缀分区后执行写操作。因为只有一个工人在做这项工作,所以要花很多时间 您可以考虑的一些事项:
谢谢你的回复。非常详细。我不知道为什么我使用重新分区比合并更有效。但是,有时重新分区无法成功执行,合并将成功。谢谢您的回复。我仍然需要检查,因为我发现重新分区比合并更有效。从理论上讲,coalesce不洗牌,因此更有效。