我有一个数据框,我打算将其写为Hive分区表。我用于此目的的代码是
for(i <- 0 until 10)
{
myDf = hiveContext.sql("select * from srcTable where col = "+i)
myDf.write.mode("append").format("parquet")
.partitionBy("period_id").saveAsTable("myTable")
}
myDf
将在每次迭代中包含一组不同的数据(我刚刚展示了如何在myDf
中获取值的简化方法)
myDf.write
大约需要5分钟才能加载120,000行数据。有什么办法可以进一步减少写这些数据的时间吗?
答案 0 :(得分:0)
首先,为什么要迭代而不是一次领导/保存所有数据?其次,我可以想象,使用您的代码,您编写了太多(小)文件,您可以在文件系统上检查它。通常我根据我用作DataFrameWriter
的分区列的同一列重新分区我的数据帧,这样我每个分区只得到1个文件(只要它不是太大,否则HDFS会自动拆分文件):
val cols = (0 until 10)
hiveContext.table("srcTable")
.where($"col".isin(cols:_*))
.repartition($"period_id")
.write
.format("parquet")
.partitionBy("period_id")
.saveAsTable("myTable")
除此之外,最好喜欢SparkUI并检查任务数量是否与执行者/核心数量有合理的关系。