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 进行查找。首先我们确定一个桶(分区),然后对其迭代器进行线性查找。
当我执行像
这样的转换时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 进行查找。首先我们确定一个桶(分区),然后对其迭代器进行线性查找。