Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark-在这种情况下,何时发生重新分区?_Apache Spark_Apache Spark Sql - Fatal编程技术网

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)时,它会洗牌所有数据,并将所有数据放在一个工作节点上的单个分区中

现在,当您执行写操作时,只有一个工作节点/执行器在按前缀分区后执行写操作。因为只有一个工人在做这项工作,所以要花很多时间

您可以考虑的一些事项:

  • 如果没有真正的理由只有一个csv文件,请尽量避免这样做
  • 与重新分区(1)不同,使用将执行最小洗牌的合并(1)而不是执行完全洗牌的重新分区(1)
  • 保存单个csv文件时,您没有利用spark的并行能力

  • 谢谢你的回复。非常详细。我不知道为什么我使用重新分区比合并更有效。但是,有时重新分区无法成功执行,合并将成功。谢谢您的回复。我仍然需要检查,因为我发现重新分区比合并更有效。从理论上讲,coalesce不洗牌,因此更有效。