Apache spark Spark PairDDS和数据帧是否索引?

Apache spark Spark PairDDS和数据帧是否索引?,apache-spark,dataframe,apache-spark-sql,rdd,Apache Spark,Dataframe,Apache Spark Sql,Rdd,当我执行像这样的变换时 pairedRdd1.join(pairedRdd2) 或 第一个pairdd或数据帧中的每个元素是否都与第二个pairdd或数据帧中的每个元素进行比较,还是更有效?根据我对Spark存储器工作原理的理解,答案是前者。但我一直相信,有一种火花魔法可以让查找速度更快。标准RDD和数据帧都没有索引。要在PairwiseRDDs上执行连接,在DataFrames上执行相等连接Spark正在使用分区。它既可以利用现有的分区器,也可以在不存在分区器的情况下将分区作为join操作的

当我执行像这样的变换时

pairedRdd1.join(pairedRdd2)


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

标准RDD和数据帧都没有索引。要在
PairwiseRDDs
上执行
连接
,在
DataFrames上执行相等连接
Spark正在使用分区。它既可以利用现有的分区器,也可以在不存在分区器的情况下将分区作为
join
操作的一部分应用

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

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

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

  • 如果RDD没有分区器,
    查找
    相当于
    过滤器
  • 如果RDD有一个分区器,那么它的行为类似于使用单独链接查找哈希表。首先我们确定一个bucket(分区),然后在其迭代器上执行线性查找
dataframe1.join(dataframe2, dataframe1.one == dataframe2.one)