我正在使用spark 1.6.1,我正在尝试将数据帧保存为orc格式。
我面临的问题是save方法非常慢,每个执行程序的50M orc文件大约需要6分钟。 这就是我保存数据框的方式
dt.write.format("orc").mode("append").partitionBy("dt").save(path)
我尝试将saveAsTable用于也使用orc格式的hive表,并且看起来速度提高了大约20%到50%,但这种方法有其自身的问题 - 似乎当任务失败时,重试将会因文件已存在而总是失败。 这就是我保存数据框的方式
dt.write.format("orc").mode("append").partitionBy("dt").saveAsTable(tableName)
有没有理由保存方法这么慢? 我做错了吗?
答案 0 :(得分:1)
问题是由于partitionBy方法造成的。 PartitionBy读取指定列的值,然后为分区列的每个值分隔数据。 尝试保存它而不进行分区,会有显着的性能差异。
答案 1 :(得分:1)
请参阅我之前关于基数和partitionBy的评论。
如果您真的想要对其进行分区,并且它只是一个50MB的文件,那么请使用类似
的内容 dt.write.format("orc").mode("append").repartition(4).saveAsTable(tableName)
重新分区将创建4个大致均匀的分区,而不是您在dt列上进行分区的操作,这可能最终会编写大量的orc文件。
4个分区的选择有点随意。您不会从分区这样的小文件中获得太多性能/并行化优势。阅读更多文件的开销是不值得的。