先上代码
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 把两个都装进去,否则会有重复值
原因未知 是否有大神知道?