Spark RDD键值对操作

1.Pair RDD的转化操作

以键值对集合{(1,2),(3,4),(3,6)}为例

1.reduceByKey(func)    合并具有相同键的值
   rdd.reduceByKey((x,y) => x+y) 结果:{(1,2),(3,10)}
2.groupByKey()    对具有相同键的值进行分组 
  rdd.groupByKey()  结果:{(1,[2]),(3,[4,6])}
3.mapValues(func) 对pair RDD 中的每个值应用一个函数而不改变键
  rdd.mapValues(x => x+1) 结果:{(1,3),(3,5),(3,7)}
 **==》等价于rdd.map( case (x,y) :(x,func(y) )**
4.flatMapValues(func) 对pair RDD 中的每个值应用一个返回迭代器的函数,
然后对返回的每个元素都生成一个对应原键的键值对记录。通常用于符号化。
  rdd.flatMapValues(x=> (x to 5) ) 结果:{(1,2),(1,3),(1,4),(1,5),(3,4),(3,5)}
5.keys()  返回一个仅包含键的RDD  
    rdd.keys() 结果:{1,3,3}
6.values()   返回一个仅包含值的RDD 
    rdd.values()  {2,4,6}
7.sortByKey() 返回一个根据键排序的RDD
   rdd.sortByKey() 结果: {(1,2),(3,4),(3,6)}
8.filter(func)  对元素进行过滤 因为pairRDD 也是RDD,是Tuple2对象
  pairs.filter{case (key,value) => value.length < 20}
9.**conbineByKey(createCombiner,mergeValue,mergeCombiners,partitioner)  
    使用不同的返回类型合并具有相同键的值
例子:这个比较难
val result = input.combineByKey((v) => (v,1),
          (acc: (Int,Int),v) =>acc._1+v,acc._2+1),
          (acc1:(Int,Int),acc2:(Int,Int)) => (acc1._2+acc2._2,acc1._2+acc2._2)
          ).map(key,value._1/value._2.toFloat)
result.collectAsMap().map(println(_))
注意:三个函数对应了三个过程
(1)def createCombiner(value): (value,1)
(2)def mergeValue(acc,value) :(acc[0]+value,acc[1]+1)
(3) mergeCombiners(acc1,acc2) :(acc1[0]+acc1[0],acc1[1]+acc2[1])

2.针对两个pair RDD的转化操作 rdd={(1,2),(3,4),(3,6)} other={(3,9)}

1.subtractByKey 删除掉RDD中键与other RDD中的键相同的元素 
  rdd.subtractByKey(other)  结果:{(1,2)}
2.join  对连个RDD进行内连接
 rdd.join(other)   结果: {(3,(4,9)),(3,(4,9))}  
3.rightOuterJoin   对另个RDD进行连接操作,确保第一个RDD的键必须存在(右外连接)
  rdd.rightOuterJoin(other)  结果:{(3,(some(4),9)),(3,(some(6),9))}
4.leftOuterJoin  对两个RDD进行连接操作,确保第二个RDD键必须存在(左外连接)
 rdd.leftOuterJoin(other)  结果:{ (1,(2,None)),(3,(4,some(9)),(3,(6,some(9))) }
5.cogroup  将两个RDD中拥有相同键的数据分组到一起
    rdd.cogroup(other)   结果:{(1,([2],[])),(3,([4,6],[9]))}

可以进行并行对调优

val data = Seq( ("a",3),("b",4),("a",1) ) 
sc.parallelize(data).reduceByKey( (x,y) => x+y,10 ) 并行对为10

自定义排序

    val data = List((1,4),(4,8),(0,4),(12,8))
    val rdd=sc.parallelize(data)
    implicit val sortIntegerByString = new Ordering[Int] {
         override def compare(Integer a, Integer b) {
             return String.valueOf(a).compareTo(String.valueOf(b))
         } 
   }
  rdd.sortByKey( sortIntegerByString  )

3.pairRDD 的行动操作

以键值对集合{(1,2),(3,4),(3,6)}

  1.countByKey()  对每个键对应的元素分别计数
    rdd.countByKey()  结果:{(1,1),(3,2)}
  2. collectAsMap()  将结果以映射表的形式返回,以便查询 
    rdd.collectAsMap()  结果:Map{(1,2),(3,6)}
  3.lookup(key)  返回给定键对应的所有值
    rdd.lookup(3)  结果:[4,6]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容