2017-05-18 93 views
0

我写我的数据帧像下面空文件输出火花

df.write().format("com.databricks.spark.avro").save("path"); 

但是我得到大约200个文件,其中30-40文件empty.I可以理解,这可能是由于空分区。然后我更新我的代码,如

df.coalesce(50).write().format("com.databricks.spark.avro").save("path"); 

但我觉得它可能会影响性能。有没有其他更好的方法来限制输出文件的数量和删除空文件

回答

1

您可以使用repartition方法在写入之前删除RDD中的空分区。

默认的分区是200

分区的建议数量是使用this methodpartitions = number of cores * 4

1

重新分区您的数据帧的数量。为了消除偏差并确保数据的均匀分布,请为partitionExprs参数在数据框中选择具有高基数(列中具有唯一值的列)的列以确保均匀分布。

1

默认没有。的RDD分区是200;你必须做洗牌来清除偏斜的分区。

您可以在RDD上使用repartition方法;或在数据帧上使用DISTRIBUTE BY子句 - 这将重新分区,并在分区之间均匀分配数据。

def repartition(numPartitions: Int, partitionExprs: Column*): Dataset[T] 

返回具有适当分区的数据集实例。

您可以使用repartitionAndSortWithinPartitions - 这可以提高压缩率。