2016-12-13 34 views
1

想知道對於大型數據集來說,兩者中的哪一個會更有效率。火花地圖RDD vs連接

可以說,我已經加載從蒙戈訂單,Orders架構是

case class Orders(organization: String, orderId: Long, recipient: String) 

val orders = MongoSpark.load[Orders](spark) 

現在我看到有要去關於下一步兩種方式,我想查找每個公司這是歸因於一個命令。

選項1是MapRDD

val companies = MongoSpark.load[Company](spark, ReadConfig(...)).map { c => (c.id, c)} 
val companiesMap = IndexedRDD(companies.rdd) 

或第二選擇是將運行一個加入

val joined = orders.join(MongoSpark.load[Company(spark), $orderId === $companyId" 

該數據集在生產服務器上從500 GB範圍 - 785 GB。

+0

你有多少公司記錄? – climbage

+0

@climbage約400,000左右。我不知道我的頭腦會有多少內存,但訂單集合有大約260-300萬條記錄。 – TheM00s3

回答

2

隨着Spark(> 2.0)的最新進展,當談到RDD與DataFrame差不多100%的時候,正確答案是DataFrames。我建議你總是試着留在DaraFrame世界,而不要過渡到RDDs。

更詳細地: RDDs將始終爲每行填充所有字段。它還將實現Scala案例類,所有字符串都是重量級Java字符串等。另一方面,帶有鎢(全階段代碼生成器及其優化的編碼器)和催化劑的DataFrame使一切更快。

  • RDD是Scala/Java。 DataFrame使用他們自己的超級精簡編碼來爲相同數據提供更多的壓縮/緩存友好表示。

  • RDD代碼不會經過Catalyst,這意味着什麼都不會實際得到(查詢)優化。

  • 最後,DataFrames有一個代碼生成器,可以真正優化不同階段的鏈接操作。

read真是一絕。