2017-03-24 50 views
0

我有一個數據框,我打算寫作蜂巢分區表。我使用該代碼到底是火花/斯卡拉 - 更快的方式來加載數據幀在蜂巢表

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

首先,你爲什麼要迭代,而不是一次導入/保存所有數據?其次,我可以想象,用你的代碼,你寫了太多(小)文件,你可以在文件系統上檢查。通常我根據我用作DataFrameWriter的分區列的同一列對我的數據幀進行重新分區,就像這樣,每個分區只有一個文件(只要它不是太大,否則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和檢查任務的數量是否與執行人/內核的數量合理的關係是個好主意。

+0

循環在那裏,因爲除了我所展示的許多其他任務使用它執行。再加上'select * from srcTable where col ='部分與來自其他數據框的大量連接相當複雜。即使我沒有使用迭代,這裏的時間也會被我在表中寫入數據框的方式所消耗。經過大量搜索後,我想通過這種方式,但我仍然想知道是否有任何方法可以加快速度。我對Spark有點新,所以我不得不查看執行者/核心部分。 – Amber