直接写入分区路径和使用partitionBy之间的区别

时间:2019-08-12 17:28:17

标签: apache-spark

两者之间是否有任何区别

df.write.partitionBy("year", "month", "day").parquet("/my/path/on/hdfs")

df.drop("year", "month", "day").write.parquet("/my/path/on/hdfs/year=2019/month=8/day=12")

(当我知道年,月和日的值是(2019/8/12)时)

1 个答案:

答案 0 :(得分:2)

Approach 1. df.write.partitionBy("year", "month", "day").parquet("/my/path/on/hdfs")

Approach 2. df.drop("year", "month", "day").write.parquet("/my/path/on/hdfs/year=2019/month=8/day=12")

取决于SaveMode,这两个语句之间可能有所不同。

默认情况下,SaveMode为ErrorIfExists。因此,如果您在/my/path/on/hdfs处有一些数据,尽管您在/my/path/on/hdfs/year=2019/month=8/day=12上可能没有任何数据,那么Approach_1将失败,而Approach_2将起作用。

如果使用SaveMode Overwrite,则Approach_1将删除/my/path/on/hdfs中存在的所有数据,并且只会在/my/path/on/hdfs/year=2019/month=8/day=12内部创建新数据。但是Approach_2不会删除/my/path/on/hdfs/中的其他分区数据。