|
|
1
83
首先,我真的会避免使用
每个拼花地板分区写一个文件非常容易(请参见 Spark dataframe write method writing many small files ):
使用orderBy 您还可以通过对数据帧进行相应的排序来控制文件的数量,而无需重新分区:
这将导致总计(至少,但不超过)
这不会更改文件的数量,但在查询给定的拼花地板文件时会提高性能
火花2.2+
从Spark 2.2开始,您还可以使用新选项
参见示例。 http://www.gatorsmile.io/anticipated-feature-in-spark-2-2-max-records-written-per-file/ spark write to disk with N files less than N partitions |
|
2
12
让我们用一种额外的方法来扩展Raphael Roth的答案,该方法将创建每个分区可以包含的文件数的上限, as discussed in this answer :
|
|
|
3
6
它在每个输出分区(目录)中生成N个文件,并且(据说)比使用
如果你在使用S3,我还建议你在本地驱动器上做所有事情(Spark在写操作中会创建/重命名/删除很多文件),一旦一切都解决了,就使用hadoop
编辑:根据评论中的讨论: 您可以创建一个分区列为年份的数据集,但每个给定年份中的数据量相差很大。因此,一年可能有1GB的数据,但另一年可能会有100GB的数据。
但是,我真的不知道这会起什么作用。Spark可能会在读取每个列分区中数量可变的文件时遇到问题。 另一种方法是编写自己的自定义分区器,但我不知道其中涉及到什么,所以我无法提供任何代码。 |
|
|
4
3
因此,一种解决方案不能很好地处理非常大的数据分区,而另一种则不能很好的处理非常小的数据分区。
解决方案是使用
以下是 the solution I posted 关于一个非常类似的问题:
这将平衡输出文件的大小,而不考虑分区倾斜,并且不会限制并行性或为小分区生成过多的小文件。 a self-contained example ,以及数据帧分区正确平衡的证明。 |