2016-10-28 56 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任何较小的数据帧将是更快 - 对于大数据框昂贵的洗牌步骤具有已经完成。

相关问题