Spark PairRDDs 和 DataFrames 是不是被索引?

Posted

技术标签:

【中文标题】Spark PairRDDs 和 DataFrames 是不是被索引?【英文标题】:Are Spark PairRDDs and DataFrames Indexed?Spark PairRDDs 和 DataFrames 是否被索引? 【发布时间】:2016-03-03 19:50:41 【问题描述】:

当我执行类似的转换时

pairedRdd1.join(pairedRdd2)

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

第一个 PairRDD 或 DataFrame 中的每个元素与第二个中的每个元素相比,还是更有效?根据我对 Spark 存储工作原理的理解,答案是前者。但我一直相信有某种 Spark 魔法可以使查找速度更快。

【问题讨论】:

【参考方案1】:

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

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

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

关于PairwiseRDD 上的lookup 操作都依赖于分区器:

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

【讨论】:

以上是关于Spark PairRDDs 和 DataFrames 是不是被索引?的主要内容,如果未能解决你的问题,请参考以下文章

pandas一些基本操作(DataFram和Series)_1

pandas一些基本操作(DataFram和Series)_3

pandas一些基本操作(DataFram和Series)_4

pandas一些基本操作(DataFram和Series)_2

Spark SQL and DataFrame Guide(1.4.1)——之DataFrames

将 DataFrame 的数据带回本地节点以在 spark/scala 中执行进一步操作(计数/显示)