0

我正在写我的数据框,如下所示

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

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

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

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

4

3 回答 3

1

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

默认分区为 200。

建议的分区数是partitions = number of cores * 4

于 2017-05-18T05:49:02.210 回答
1

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

于 2017-05-18T05:54:09.737 回答
1

默认没有。RDD 分区数为 200;你必须做 shuffle 来删除倾斜的分区。

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

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

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

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

于 2017-05-18T07:05:29.797 回答