考虑通用算法:
val first : DataFrame = ... // about 100 Mb
val second : DataFrame = ... // about 5 GMb
val third : DataFrame = ... // about 7 GMb
val fourth : DataFrame = ... // about 13 GMb
//all dataframe are filtered, renamed all columns. A new colun is added into `third` and `fourth`
val = firstAndSecond = first.join(first("first_id") === second("second_id"))
val = thirdsAndAll = firstAndSecond.join(firstAndSecond("some_id") === third("third_id"))
val = fourthAndAll = thirdsAndAll.join(thirdsAndAll("other_id") === fourth("fourth_id"))
fourthAndAll.write.mode(saveMode = SaveMode.Overwrite).parquet("file://C:path")
注释*
问题
我输出的实木复合地板文件的大小有很大不同,从100 kb到500Nb。同样,较大的文件有很长的写入时间。 例如。每个文件都由某些线程写入,这些线程写入500Mb,450Mb(等)文件执行其工作时间过长。 (对于500Mb,大约需要8个小时)
有没有人想到如何设置spark来写入大小相等的CPU负载的镶木地板文件?
答案 0 :(得分:0)
(我主要使用RDD
s,对dataframe api的使用经验不多,但是我猜它的工作方式相同)
我猜.parquet
为rdd的每个分区创建了一个文件。如果文件大小完全不同,则数据不会均匀分布在各个分区中。
它还可能会降低join
操作的性能。 repartition
命令应该会有所帮助。