【spark】七 DataFrame的repartition、partitionBy、coalesce区别

环境:spark 2…3.1 python 2.7

问题:发现spark DataFrame.write 无论format(“csv”).save(hdfsPath)中是csv、parquet、json,或者使用write.csv() write.json()保存之后都是一个目录,下面生成很多个文件,只有设置分区为一个时,才能在目录下只有一个.success文件和一个分区数据文件(即小文件数据文件个数与分区个数对应)

所以要弄明白几个分区的意思:

一 repartition(numPartitions, *cols) 重新分区(内存中,用于并行度),用于分区数变多,设置变小一般也只是action算子时才开始shuffing;而且当参数numPartitions小于当前分区个数时会保持当前分区个数等于失效。

	df.reparition(100,"month")

二 partitionBy(*cols) 根据指定列进行分区(主要磁盘存储,影响生成磁盘文件数量,后续再从存储中载入影响并行度),相似的在一个区,并没有参数来指定多少个分区,而且仅用于PairRdd

df.map(lambda x:(x[0],x[1],x[2])).toDF(["month","day","value"]).partitionBy(["month","day"])

三 coalesce(numPartitions) 联合分区,用于将分区变少。不能指定按某些列联合分区

df.coalesce(1).rdd.getNumPartitions()

你可能感兴趣的:(spark)