2016-01-13 60 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

感谢您的建议。我有点猜测这是创建结果的最佳逻辑,但如果有其他解决方案 - 不使用笛卡尔函数的解决方案 - 我会很乐意了解它们。并不是数据集太大,而是在两个数据集上进行“连接”都需要很长时间。 –