我有一个Scala代码,如下所示:
val new_rdd = rdd1.join(rdd2).map(x => (x._2._2, x._2._1))
我不确定,但我认为我可以使用case class
来避免使用此x._2._2
。你能帮帮我吗?
在这种情况下,rdd1
为RDD[String,Array[String]]
,rdd2
为RDD[String,Array[Int]]
。
答案 0 :(得分:4)
这不是case class
,但我认为这可能是您正在寻找的内容:
val new_rdd = rdd1.join(rdd2).map{ case (_, (a, b)) => (b, a) }
答案 1 :(得分:1)
这样的事情也可以做到:
case class Items(id: String,items: List[String])
case class ItemCounts(id: String,itemcounts: List[Int])
val rdd1 = sc.parallelize(Seq(
Items("id1",List("item10","item2","item4")),
Items("id2",List("item4","item9")),
Items("id3",List("item1","item3"))))
val rdd2 = sc.parallelize(Seq(
ItemCounts("id1",List(100,200)),
ItemCounts("id2",List(200,500,100,1100)),
ItemCounts("id3",List(10))))
创建一个pairRDD以便加入。
val ItemsRDD = rdd1.map(item => (item.id, item))
val ItemsCountsRDD= rdd2.map(itemcnts => (itemcnts.id, itemcnts))
ItemsRDD.join(ItemsCountsRDD).map(x => (x._2._1.id,x._2._2.itemcounts))
.collect.foreach(println)
结果如下所示:
(id3,List(10))
(id1,List(100, 200))
(id2,List(200, 500, 100, 1100))