Spark PairRDDs和DataFrames是否被索引?

use*_*730 2 dataframe apache-spark rdd apache-spark-sql

当我执行变换时

pairedRdd1.join(pairedRdd2)
Run Code Online (Sandbox Code Playgroud)

要么

dataframe1.join(dataframe2, dataframe1.one == dataframe2.one)
Run Code Online (Sandbox Code Playgroud)

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

zer*_*323 5

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

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

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

关于all的lookup操作PairwiseRDD取决于分区:

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