Spark数据帧saveAsTable vs save

时间:2016-07-22 16:13:13

标签: apache-spark spark-dataframe orc

我正在使用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)

有没有理由保存方法这么慢? 我做错了吗?

2 个答案:

答案 0 :(得分:1)

问题是由于partitionBy方法造成的。 PartitionBy读取指定列的值,然后为分区列的每个值分隔数据。 尝试保存它而不进行分区,会有显着的性能差异。

答案 1 :(得分:1)

请参阅我之前关于基数和partitionBy的评论。

如果您真的想要对其进行分区,并且它只是一个50MB的文件,那么请使用类似

的内容

dt.write.format("orc").mode("append").repartition(4).saveAsTable(tableName)

重新分区将创建4个大致均匀的分区,而不是您在dt列上进行分区的操作,这可能最终会编写大量的orc文件。

4个分区的选择有点随意。您不会从分区这样的小文件中获得太多性能/并行化优势。阅读更多文件的开销是不值得的。