2016-10-28 29 views
1

我有兩個DataFrame,每個DataFrame都保存在實木複合地板文件中。我需要通過唯一的增量「id」列來連接這兩個DF。 我可以在ID列創建索引,以便他們可以更快地加入?這裏是代碼我可以索引實木複合地板文件中的一列,以便使用Spark更快地加入它。

// First DF which contain a few thousands items 
val dfExamples = sqlContext.parquetFile("file:///c:/temp/docVectors.parquet") 
// Second DF which contains 10 million items 
val dfDocVectors = sqlContext.parquetFile(docVectorsParquet) // DataFrame of (id, vector) 

dfExamples.join(dfDocVectors, dfExamples("id") === dfDocVectors("id")).select(dfDocVectors("id"), 
dfDocVectors("vector"), dfExamples("cat")) 

我需要多次執行此類連接。爲了加快連接,我可以創建索引 實木複合地板文件中的「id」列,就像我可以對數據庫表做什麼?

回答

2

Spark聯接使用名爲partitioner的對象。如果數據幀沒有分區,執行加入將涉及下列步驟操作:

  1. 了更大的側
  2. 隨機對這個分區都dataframes
  3. 現在我們已經得到了相同的密鑰創建一個新的哈希分區在同一節點上,所以本地連接操作可以完成執行

您可以通過尋址#1和#2中的某些來優化您的連接。我建議您通過連接鍵(ID)重新分區,更大的數據集:

// First DF which contain a few thousands items 
val dfExamples = sqlContext.parquetFile("file:///c:/temp/docVectors.parquet") 
// Second DF which contains 10 million items 
val dfDocVectors = sqlContext.parquetFile(docVectorsParquet) 
    .repartition($"id") 
// DataFrame of (id, vector) 

現在,加盟與dfDocVectors任何較小的數據幀將是更快 - 對於大數據框昂貴的洗牌步驟具有已經完成。

相關問題