繁体   English   中英

Apache Spark:通过简单的操作即可进行多次RDD传递

[英]Apache Spark: RDD multiple passes with a simple operation

我在学习Apache Spark框架时遇到了这个问题。 考虑以下简单的RDD

scala> val rdd1 = sc.parallelize(List((1, Set("C3", "C2")), 
                                      (2, Set("C1", "C5", "C3")), 
                                      (3, Set("C2", "C7"))))
rdd1: RDD[(Int, Set[String])]

我想将rdd1中每个元素中的每个Set与“相同” rdd1中每个其他元素的集合rdd1 因此结果将采用以下形式:

newRDD: RDD[(Int, Int, Set[String])]
// and newRDD.collect will look like:
newRDD: Array[(Int, Int, Set[String])] = Array((1, 1, Set("C3", "C2")), (1, 2, Set("C3")), (1, 3, Set("C2")),
                                               (2, 1, Set("C3")), (2, 2, Set("C1", "C5", "C3")), (2, 3, Set()),
                                               (3, 1, Set("C2")), (3, 2, Set()), (1, 3, Set("C2", "C7")))

我尝试像这样嵌套rdd1

scala> val newRDD = rdd1 map (x => {rdd1 map (y => (x._1, y._1, x._2.intersect(y._2)))})

但是,这将引发“任务不可序列化”异常。

现在,如果我想在执行之前避免rdd1.collect()或任何其他操作操作

scala> val newRDD = rdd1 map (x => {rdd1 map (y => (x._1, y._1, x._2.intersect(y._2)))})

是否有可能达到所需的newRDD

为什么你得到“任务不serilizable”异常的原因是因为你试图把一个RDD在地图的其他RDD ,在这种情况下,星火会尝试连载第二RDD 通常,您可以通过联接解决此类问题:

val newRDD = rdd1.cartesian(rdd1).map { case ((a, aSet), (b, bSet)) =>
   (a, b, aSet.intersect(bSet))
}

在这里,笛卡尔联接在新的RDD创建一对每个集合,您可以将它们相交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM