2

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

我面临的问题是save方法很慢,每个executor上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)

保存方法这么慢是有原因的吗?难道我做错了什么?

4

2 回答 2

1

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

如果你真的想对它进行分区,它只是一个 50MB 的文件,那么使用类似的东西

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

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

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

于 2017-06-15T07:45:45.060 回答
1

问题是由于 partitionBy 方法。PartitionBy 读取指定列的值,然后为分区列的每个值分离数据。尽量不按分区保存,会有明显的性能差异。

于 2016-07-22T17:26:57.287 回答