Spark / Scala-在蜂巢表中加载数据帧的更快方法

时间:2017-03-24 05:33:09

标签: scala apache-spark hive

我有一个数据框,我打算将其写为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行数据。有什么办法可以进一步减少写这些数据的时间吗?

1 个答案:

答案 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并检查任务数量是否与执行者/核心数量有合理的关系。