2016-01-13 85 views
0

,我有以下數據:星火表改造(錯誤:5063)

val RDDApp = sc.parallelize(List("A", "B", "C")) 
val RDDUser = sc.parallelize(List(1, 2, 3)) 
val RDDInstalled = sc.parallelize(List((1, "A"), (1, "B"), (2, "B"), (2, "C"), (3, "A"))).groupByKey 
val RDDCart = RDDUser.cartesian(RDDApp) 

我想,這樣我有元組的RDD與映射該數據(用戶ID,布爾如果字母,給出了用戶)。我以爲我找到了一個解決方案:

val results = RDDCart.map (entry => 
    (entry._1, RDDInstalled.lookup(entry._1).contains(entry._2)) 
) 

如果我打電話results.first,我得到org.apache.spark.SparkException: SPARK-5063。我在Mapping函數中看到Action的問題,但不知道如何解決它,以便得到相同的結果。

回答

1

只是joinmapValues

RDDCart.join(RDDInstalled).mapValues{case (x, xs) => xs.toSeq.contains(x)} 
+0

是否有其他辦法做到這一點,如果數據集是非常大的? –

+0

我不確定我是否理解所有的邏輯。特別是笛卡兒需要創造'RDDCart'的氣味。但是,如果兩個數據集都不適合內存,那麼單獨加入可能是唯一有效的__exact__解決方案。 – zero323

+0

感謝您的建議。我有點猜測這是創建結果的最佳邏輯,但如果有其他解決方案 - 不使用笛卡爾函數的解決方案 - 我會很樂意瞭解它們。並不是數據集太大,而是在兩個數據集上進行「連接」都需要很長時間。 –