我有两个Dataframe,每个都保存在Parquet文件中。我需要通过唯一的增量“id”列连接这两个df。我可以在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) // DataFrame of (id, vector)
dfExamples.join(dfDocVectors, dfExamples("id") === dfDocVectors("id")).select(dfDocVectors("id"),
dfDocVectors("vector"), dfExamples("cat"))
我需要执行这样的加入很多次。为了加快连接速度,我可以在parquet文件中的“id”列上创建索引,就像对数据库表所做的那样吗?
1条答案
按热度按时间xtupzzrd1#
spark连接使用一个称为partitioner的对象。如果Dataframe没有分区器,则执行联接将涉及以下步骤:
为较大的一方创建一个新的散列分区器
对这个分区器洗牌两个Dataframe
现在我们在同一个节点上有了相同的键,所以本地连接操作可以完成执行
您可以通过解决#1和#2中的一些问题来优化联接。我建议您通过join键(id)重新划分更大的数据集:
现在,将任何较小的Dataframe与dfdocvectors连接起来会快得多——大Dataframe的代价高昂的洗牌步骤已经完成。