Spark PairRDDs 和 DataFrames 是否被索引?

Are Spark PairRDDs and DataFrames Indexed?

当我执行像

这样的转换时
pairedRdd1.join(pairedRdd2)

dataframe1.join(dataframe2, dataframe1.one == dataframe2.one)

第一个 PairRDD 或 DataFrame 中的每个元素是否都与第二个中的每个元素进行比较,还是更有效?根据我对 Spark 存储工作原理的理解,答案是前者。但我一直相信有某种 Spark 魔法可以使查找速度更快。

标准 RDD 和 DataFrame 都没有被索引。要在 PairwiseRDDs 上执行 joins 并在 DataFrames 上执行相等连接,Spark 正在使用分区。它可以利用现有的分区程序,或者如果不存在则将分区应用为 join 操作的一部分。

这意味着基于相等的联接只需要比较明确定义的对,而不是完整的笛卡尔积。在分区级别,这可以通过使用 coGroup 类操作 (RDD) 或 SortMergeJoin (DataFrames).

进一步改进

这并不意味着无法在分布式数据结构上建立索引。 Spark 生态系统中有一些工具可以在 Spark 之上提供索引 (IndexedRDD) or use external indexing (IgniteRDD)。最后,压缩的列式存储可用于对未索引的数据执行高效查找。

关于 PairwiseRDD 上的 lookup 操作完全取决于分区程序:

  • 如果 RDD 没有分区器 lookup 等价于 filter.
  • 如果 RDD 具有分区程序,其行为类似于使用单独链接对散列 table 进行查找。首先我们确定一个桶(分区),然后对其迭代器进行线性查找。