当我执行像
这样的转换时pairedRdd1.join(pairedRdd2)
或
dataframe1.join(dataframe2, dataframe1.one == dataframe2.one)
第一个PairRDD或DataFrame中的每个元素都与第二个中的每个元素进行比较,还是更高效地完成?基于我对Spark存储如何工作的理解,答案就是前者。但我一直认为,有一种Spark魔法可以使查找速度更快。
答案 0 :(得分:5)
标准RDD和DataFrame都没有编入索引。要在joins
上执行PairwiseRDDs
并在DataFrames
上执行相等连接,Spark正在使用分区。它可以利用现有的分区程序,或者如果不存在,则应用分区作为join
操作的一部分。
这意味着基于等同的连接只需要对定义良好的对进行比较,而不是完整的笛卡尔积。在分区级别,可以使用coGroup
类似操作(RDD)或SortMergeJoin
(DataFrames
)进一步改进此功能。
这并不意味着无法对分布式数据结构进行索引。 Spark生态系统中有一些工具可以在Spark(IndexedRDD
)之上提供索引或使用外部索引(IgniteRDD
)。最后,压缩柱状存储可用于对未编制索引的数据执行有效查找。
关于lookup
上的PairwiseRDD
操作,所有操作都依赖于分区程序:
lookup
等同于filter
。