如何从cogroup迭代组以打印键及其值(每组)?

时间:2017-05-20 11:01:30

标签: apache-spark rdd

我正在学习火花并拥有以下代码:

val rdd2 = sc.parallelize(Seq(("key1", 5),("key2", 4),("key4", 1)))
val grouped = rdd1.cogroup(rdd2)
grouped.collect()

输出:

Array[(String, (Iterable[Int], Iterable[Int]))] = Array(
  (key3,(CompactBuffer(1),CompactBuffer())), 
  (key1,(CompactBuffer(1, 3),CompactBuffer(5))),
  (key4,(CompactBuffer(),CompactBuffer(1))),
  (key2,(CompactBuffer(2),CompactBuffer(4))))

如何以我得到输出的方式迭代值,如下所示:

key1,1,3,5

key2,2,4

key4,1

key3,1

下面是我试过的代码。

val z=grouped.map{x=>
 val key=x._1
 val value=x._2
 val source1=value._1
 val final_value=source1.map{if(value._1>=1) value._1}
 (key,final_value)
 }

2 个答案:

答案 0 :(得分:2)

我建议您将cogroup替换为join,它会为您提供一系列与键及其值(作为集合)的对,如下所示:

val rdd1 = sc.parallelize(Seq(("key1", 1), ("key1", 3), ("key2", 2), ("key3", 1)))
val rdd2 = sc.parallelize(Seq(("key1", 5),("key2", 4),("key4", 1)))
val joined = rdd1.join(rdd2)
scala> joined.foreach(println)
(key2,(2,4))
(key1,(1,5))
(key1,(3,5))

// or using Spark SQL's Dataset API
scala> joined.toDF("key", "values").show
+----+------+
| key|values|
+----+------+
|key1| [1,5]|
|key1| [3,5]|
|key2| [2,4]|
+----+------+

如果您希望继续使用cogroup来学习Spark的RDD API,请按以下方式打印grouped.collect

// I assume grouped is the value after cogroup+collect
// just because it's easier to demo the solution
val grouped = rdd1.cogroup(rdd2).collect
scala> grouped.foreach(println)
(key1,(CompactBuffer(1, 3),CompactBuffer(5)))
(key2,(CompactBuffer(2),CompactBuffer(4)))
(key3,(CompactBuffer(1),CompactBuffer()))
(key4,(CompactBuffer(),CompactBuffer(1)))

// the solution
grouped.
  map { case (k, (g1, g2)) => (k, g1 ++ g2) }.
  map { case (k, vs) => s"$k,${vs.mkString(",")}" }.
  foreach(println)

答案 1 :(得分:0)

我认为最常用的方法是转换为数据框并按键分组并将值收集为列表。

 val rdd2 = spark.sparkContext.parallelize(Seq(("key1", 3),("key1", 5),("key2", 4),("key4", 1))).toDF("K", "V")
 rdd2.groupBy("K").agg(collect_list($"V")).show

希望这有帮助