Spark 数据帧 saveAsTable 与 save

use*_*555 6 apache-spark apache-spark-sql orc

我正在使用 Spark 1.6.1,我正在尝试将数据帧保存为 orc 格式。

我面临的问题是save方法非常慢,每个执行器上50M的orc文件大约需要6分钟。这就是我保存数据框的方式

dt.write.format("orc").mode("append").partitionBy("dt").save(path)
Run Code Online (Sandbox Code Playgroud)

我尝试对也使用 orc 格式的 hive 表使用 saveAsTable,这似乎快了大约 20% 到 50%,但这种方法有它自己的问题 - 似乎当任务失败时,重试总是会失败,因为文件已经存在。这就是我保存数据框的方式

dt.write.format("orc").mode("append").partitionBy("dt").saveAsTable(tableName)
Run Code Online (Sandbox Code Playgroud)

保存方法如此缓慢是否有原因?难道我做错了什么?

Ank*_*kit 2

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