scala中reducebykey使用时的坑

先上代码

def artList(dataFrame: DataFrame) = {

    //dataFrame.repartition(80)
    //创建变量

    //处理数据
    val artData: RDD[(String, util.List[lang.String])] = dataFrame
      .repartition(180) .rdd.mapPartitions(xx => {
      val flatten: Iterator[(String, util.List[lang.String])] = xx.flatMap(x => {

        //创建list封装
        //  val list3: util.List[(String,util.List[lang.Double])] = new util.ArrayList[(String,util.List[lang.Double])]()
        val list3 = new ListBuffer[(String, util.List[lang.String])]
        val mediatype = x.getAs[String]("mediatype").trim
        val medianame = x.getAs[String]("medianame").trim
        val pagesrc = x.getAs[String]("pagesrc").trim
        val maybeDouble: Option[Double] = parseDouble(x.getAs[Float]("z"))
        val dou = maybeDouble.get
        //判断类型和名字是否为空
        if (mediatype != null && !mediatype.isEmpty && medianame != null && !medianame.isEmpty) {
          val list: util.List[lang.String] = new util.ArrayList[lang.String]()
          val key = mediatype + "#" + medianame
         // list.add(dou)
          list.add(x.getAs[String]("aid"))
          list3.+=((key, list))
        }
        //去除转载自己的  和类型为微信的
        if (pagesrc != null && !pagesrc.isEmpty && !"".equals(pagesrc) && !"weixin".equals(mediatype) && !pagesrc.equals(medianame)) {
          val key2 = "app" + "#" + pagesrc
          val key3 = "press" + "#" + pagesrc
          val key4 = "web" + "#" + pagesrc
          val list1: util.List[java.lang.String] = new util.ArrayList[lang.String]()
          list1.add(x.getAs[String]("aid"))
          //list1.add(dou)
          list3.+=((key2, list1))
          list3.+=((key3, list1))
          list3.+=((key4, list1))
        }
        list3
      })
      flatten
    })

    //聚合
  val value1: RDD[(String, util.List[lang.String])] = artData.reduceByKey(
      (list1, lsit2) => {
        list1.addAll(lsit2)
        list1
      }
    )
    value1

  }


以上代码reducebykey后value(聚合后的list)内部有重复值
而且我重复运行很多次,每次的重复条数不一样,
第一次可能有50条重复值
第二条可能有30条
第三次可能有60条
每条数据aid数据是唯一的
将reducebykey代码改为

def artList(dataFrame: DataFrame) = {

    //dataFrame.repartition(80)
    //创建变量

    //处理数据
    val artData: RDD[(String, util.List[lang.String])] = dataFrame
      .repartition(180) .rdd.mapPartitions(xx => {
      val flatten: Iterator[(String, util.List[lang.String])] = xx.flatMap(x => {

        //创建list封装
        //  val list3: util.List[(String,util.List[lang.Double])] = new util.ArrayList[(String,util.List[lang.Double])]()
        val list3 = new ListBuffer[(String, util.List[lang.String])]
        val mediatype = x.getAs[String]("mediatype").trim
        val medianame = x.getAs[String]("medianame").trim
        val pagesrc = x.getAs[String]("pagesrc").trim
        val maybeDouble: Option[Double] = parseDouble(x.getAs[Float]("z"))
        val dou = maybeDouble.get
        //判断类型和名字是否为空
        if (mediatype != null && !mediatype.isEmpty && medianame != null && !medianame.isEmpty) {
          val list: util.List[lang.String] = new util.ArrayList[lang.String]()
          val key = mediatype + "#" + medianame
         // list.add(dou)
          list.add(x.getAs[String]("aid"))
          list3.+=((key, list))
        }
        //去除转载自己的  和类型为微信的
        if (pagesrc != null && !pagesrc.isEmpty && !"".equals(pagesrc) && !"weixin".equals(mediatype) && !pagesrc.equals(medianame)) {
          val key2 = "app" + "#" + pagesrc
          val key3 = "press" + "#" + pagesrc
          val key4 = "web" + "#" + pagesrc
          val list1: util.List[java.lang.String] = new util.ArrayList[lang.String]()
          list1.add(x.getAs[String]("aid"))
          //list1.add(dou)
          list3.+=((key2, list1))
          list3.+=((key3, list1))
          list3.+=((key4, list1))
        }
        list3
      })
      flatten
    })

    //聚合
    val value1: RDD[(String, util.List[lang.String])] = artData.reduceByKey(
      (list1, lsit2) => {
        val list: util.ArrayList[lang.String] = new util.ArrayList[lang.String]
        list.addAll(list1)
        list.addAll(lsit2)
        list
      }
    )
    value1

  }

这样就去掉了重复值
也就是说要新建一个list 把两个都装进去,否则会有重复值
原因未知 是否有大神知道?

你可能感兴趣的:(scala,reducebykey)