Spark PairRDDs和DataFrames是否被索引?

时间:2016-03-03 19:50:41

标签: apache-spark dataframe apache-spark-sql rdd

当我执行像

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

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

第一个PairRDD或DataFrame中的每个元素都与第二个中的每个元素进行比较,还是更高效地完成?基于我对Spark存储如何工作的理解,答案就是前者。但我一直认为,有一种Spark魔法可以使查找速度更快。

1 个答案:

答案 0 :(得分:5)

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

这意味着基于等同的连接只需要对定义良好的对进行比较,而不是完整的笛卡尔积。在分区级别,可以使用coGroup类似操作(RDD)或SortMergeJoinDataFrames)进一步改进此功能。

这并不意味着无法对分布式数据结构进行索引。 Spark生态系统中有一些工具可以在Spark(IndexedRDD)之上提供索引或使用外部索引(IgniteRDD)。最后,压缩柱状存储可用于对未编制索引的数据执行有效查找。

关于lookup上的PairwiseRDD操作,所有操作都依赖于分区程序:

  • 如果RDD没有分区lookup等同于filter
  • 如果RDD具有分区行为类似于具有单独链接的哈希表上的查找。首先,我们确定一个桶(分区),然后对其迭代器执行线性查找。