原因就不解释了,总之是因为多线程并行往hdfs写造成的(因为每个DataFrame/RDD分成若干个Partition,这些partition可以被并行处理)。
其结果就是一个存下来的文件,其实是hdfs中一个目录,在这个目录下才是众多partition对应的文件,最坏的情况是出现好多size为0的文件。
如果确实想避免小文件,可以在save之前把DaraFrame的partition设为0: (当然,这必然影响程序效率)
1. 如果是Spark 1.3.x, 可以调用函数如下:
【DataFrame2】=【DataFrame1】.repartition(1);
【DataFrame2】.save(path);
2. 如果是Spark 1.4.0, 可以调用如下函数:
【DataFrame2】=【DataFrame1】.coalecse(1, false)