key-value型Rdd转广播变量时注意

本文介绍如何将包含重复键的(key,value)型RDD转换为Spark广播变量,避免使用collectAsMap方法导致的值覆盖问题,并提供了一种利用collect加foldLeft的方法来组合相同键的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当将一个(key,value)Rdd转成广播变量时,需要将该Rdd转成Map类型,但是若一个key对应多个value,直接使用collectAsMap()方法时,key值相同的value会被覆盖,所以不能直接使用collectAsMap()方法。那怎么办了?应该使用collect() + foldLeft()的方式,组成mutable.HashMap对象。collect()Rdd转成ArrayfoldLeft()将相同key值的value组合成一个Array,最后生成一个Map即可。后续方便广播变量使用。


程序测试结果:


代码如下:

//collectAsMap将key值相同的value进行覆盖,测试如下:
val data = sc.parallelize(List((1, "www"), (1, "iteblog"), (1, "com"), (2, "bbs"), (2, "iteblog"), (2, "com"), (3, "good")))
println("原始data:")
data.foreach(x => print(x + ";"));println();println()

val data2 = data.collectAsMap
println("collectAsMap后:")
data2.foreach(println(_));println();println()

val data3: Array[(Int, String)] = data.collect()
//把如上的array折叠起来

val data4 = data3.foldLeft(scala.collection.mutable.HashMap[Int, ArrayBuffer[String]]())((curH, item) => {
  if (curH.contains(item._1)) {
    curH(item._1) += (item._2)
    curH
  }
  else {
    curH(item._1) = ArrayBuffer(item._2)
    curH
  }
})
println("foldLeft后:")
data4.foreach(println(_))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值