scala - Convert RDD[(K,V) to Map[K,List[V]]
问题描述
How can i convert a RDD of tuple2 (Key,Value) with duplicate Keys into a Map[K,List[V]] ?
Input example:
val list = List((1,a),(1,b),(2,c),(2,d))
val rdd = sparkContext.parallelize(list)
Output expected:
Map((1,List(a,b)),(2,List(c,d)))
解决方案
Just use groupByKey
, then collectAsMap
:
val rdd = sc.parallelize(List((1,"a"),(1,"b"),(2,"c"),(2,"d")))
rdd.groupByKey.collectAsMap
// res1: scala.collection.Map[Int,Iterable[String]] =
// Map(2 -> CompactBuffer(c, d), 1 -> CompactBuffer(a, b))
Alternatively, use map/reduceByKey
then collectAsMap
:
rdd.map{ case (k, v) => (k, Seq(v)) }.reduceByKey(_ ++ _).
collectAsMap
// res2: scala.collection.Map[Int,Seq[String]] =
// Map(2 -> List(c, d), 1 -> List(a, b))
推荐阅读
- amazon-s3 - SFTP 到 Amazon S3 失败并出现错误“无法关闭文件”
- c# - 有没有办法从 Firebase RealtimeDatabase 的根目录知道密钥的数量?
- adsense - Adsense“自动广告”强制 CLS 布局转变
- mysql - MYSQL Json 根据重复字段从数组中删除对象
- json - 错误是无法读取数据,因为它的格式不正确
- java - FireBase 消息无法在 OSGI 包中加载 admin_sdk.properties
- ruby-on-rails - Twilio 在 ruby 中获取过去 5 天的所有通话记录
- javascript - 单击一个页面中的按钮以锚定链接以在另一页面中打开特定的手风琴选项卡
- websphere - 如何在 IBM ILOG CPLEX Optimization Studio 上使用 SOS2
- r - 用于引用与特定因子值关联的值的函数