我可以在parquet文件中索引一个列,以便使用spark更快地连接它吗

3zwtqj6y  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(447)

我有两个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”列上创建索引,就像对数据库表所做的那样吗?

xtupzzrd

xtupzzrd1#

spark连接使用一个称为partitioner的对象。如果Dataframe没有分区器,则执行联接将涉及以下步骤:
为较大的一方创建一个新的散列分区器
对这个分区器洗牌两个Dataframe
现在我们在同一个节点上有了相同的键,所以本地连接操作可以完成执行
您可以通过解决#1和#2中的一些问题来优化联接。我建议您通过join键(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)

现在,将任何较小的Dataframe与dfdocvectors连接起来会快得多——大Dataframe的代价高昂的洗牌步骤已经完成。

相关问题