繁体   English   中英

Spark Scala中的Array [RDD [(String,Set [String])]]转换

[英]Array[RDD[(String, Set[String])]] transformation in Spark Scala

我有一个类型为Array [RDD [(String,Set [String])]]的RDD数组,其中每个RDD是键和值的元组。 键是字符串,值是Set [String],我想合并/合并具有相同键的Set。 我试图在斯卡拉这样做,但没有喜悦。 你能帮我一下吗。

e.g.
RDD["A",Set("1","2")]
RDD["A",Set("3","4")]
RDD["B",Set("1","2")]
RDD["B",Set("3","4")]
RDD["C",Set("1","2")]
RDD["C",Set("3","4")]

After transformation:
RDD["A",Set("1","2","3","4")]
RDD["B",Set("1","2","3","4")]
RDD["C",Set("1","2","3","4")]

如果将单个RDD作为输出是可以的(实际上并没有任何理由要制作许多只包含1条记录的RDD ),则可以将RDD Array简化为单个RDD ,然后执行groupByKey

arr.reduce( _ ++ _ )
   .groupByKey
   .mapValues(_.flatMap(identity))

实例:

scala> val x = sc.parallelize( List( ("A", Set(1,2)) ) )
scala> val x2 = sc.parallelize( List( ("A", Set(3,4)) ) )
scala> val arr = Array(x,x2)
arr: Array[org.apache.spark.rdd.RDD[(String, scala.collection.immutable.Set[Int])]] = Array(ParallelCollectionRDD[0] at parallelize at <console>:27, ParallelCollectionRDD[1] at parallelize at <console>:27)
scala> arr.reduce( _ ++ _ ).groupByKey.mapValues(_.flatMap(identity)).foreach(println)
(A,List(1, 2, 3, 4))

@Edit:我发现这不是一个好主意,建议您重新考虑一下,但是您可以通过从上方获取所有键并多次过滤RDD来获得所需的结果:

val sub = arr.reduce( _ ++ _ ).groupByKey.mapValues(_.flatMap(identity))
val keys = sub.map(_._1).collect()
val result = for(k <- keys) yield sub.filter(_._1 == k)
result: Array[org.apache.spark.rdd.RDD[(String, Iterable[Int])]]

每个RDD都有一个元组,真的不认为它非常有用,性能很好。

暂无
暂无

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

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