2016-03-03 23 views
2

當我執行變換像Spark PairRDDs和DataFrames是否被索引?

pairedRdd1.join(pairedRdd2) 

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

在第一PairRDD或數據幀的每個元素在第二的每一個元素進行比較,或者它更有效地完成?基於我對Spark的存儲工作原理的理解,答案是前者。但我一直相信,有一種Spark技術可以使查找速度更快。

回答

5

標準RDD和DataFrames都沒有索引。在PairwiseRDDs上執行joins並在DataFrames上加上等號加入Spark正在使用分區。它可以利用現有的分區程序,或者如果不存在應用分區作爲join操作的一部分。

這意味着基於等式的聯接只需要對明確定義的對進行比較,而不是完整的笛卡兒積。在分區級別,這可以通過使用coGroup類似操作(RDD)或SortMergeJoinDataFrames)進一步改進。

這並不意味着對分佈式數據結構的索引是不可能的。 Spark生態系統中有一些工具可以在Spark(IndexedRDD)之上提供索引,或者使用外部索引(IgniteRDD)。最後,壓縮的列式存儲可用於對未編制索引的數據執行高效查找。

關於對PairwiseRDD所有lookup操作取決於分區:

  • 如果RDD沒有分區lookup相當於filter
  • 如果RDD具有分區行爲,則與使用單獨鏈接的散列表上的查找類似。首先我們確定一個桶(分區),然後在其迭代器上執行線性查找。
相關問題