Performance 如何有效地从Spark中的每列中查找不同的值

Performance 如何有效地从Spark中的每列中查找不同的值,performance,scala,apache-spark,Performance,Scala,Apache Spark,为了从数组的每一列中找到不同的值,我尝试了 RDD[Array[String]].map(_.map(Set(_))).reduce { (a, b) => (a.zip(b)).map { case (x, y) => x ++ y}} 它成功地执行了。然而,我想知道是否有比上面的示例代码更有效的方法来实现这一点。谢谢。聚合节省了一个步骤,可能会更高效,也可能不会更高效 val z = Array.fill(5)(Set[String]()) // or whatever th

为了从
数组的每一列中找到不同的值,我尝试了

RDD[Array[String]].map(_.map(Set(_))).reduce { 
(a, b) => (a.zip(b)).map { case (x, y) => x ++ y}}

它成功地执行了。然而,我想知道是否有比上面的示例代码更有效的方法来实现这一点。谢谢。

聚合节省了一个步骤,可能会更高效,也可能不会更高效

val z = Array.fill(5)(Set[String]()) // or whatever the length is
val d= lists.aggregate(z)({(a, b) => (a.zip(b)).map { case (x, y) => x + y}}, 
                          {(a, b) => (a.zip(b)).map { case (x, y) => x ++ y}})
您还可以尝试在每个步骤中使用可变集并进行修改,而不是生成新的可变集(Spark明确允许这一点):


您可以使用聚合来避免首先映射RDD并将其转换为集合。固定大小的数组是否已知?谢谢。。。。。。但是,这和我的代码是一样的……任何方法都可以在列中同时找到不同的值,这样我们就可以减少更多的时间!不知道你的意思。这将遍历所有行,查看行中的每一列。你试过可变集合吗?我对答案进行了编辑,添加了这一点。我认为最好使用aggregate…,使用第一个示例代码。。。。因为foreach不是一个好方法……而且使用聚合也不有效。第二种可能更有效,因为它创建的对象更少
foreach
并不是天生的低效或“好方法”,它只是完成工作的工具。一个“零”元素。用于聚合的东西。在本例中,为每列指定一个空集。
val z = Array.fill(5)(scala.collection.mutable.Set[String]())
val d= lists.aggregate(z)({(a, b) => (a.zip(b)).foreach { case (x, y) => x+= y };a},
                          {(a, b) => (a.zip(b)).foreach { case (x, y) => x ++= y};a})