寒假学习进度
今天完成学习了一个案例的实践和一些spark算子的学习
(1)join
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator15")
val sc = new SparkContext(sparkConf)
val rdd1 = sc.makeRDD(
List(("a",1),("b",2),("c",3))
)
val rdd2 = sc.makeRDD(
List(("a",4),("b",5),("c",6))
)
//两数据源相同key组合在一起形成元组
//如果两数据源中key没有匹配上就不会出现
val joinrdd: RDD[(String, (Int, Int))] = rdd1.join(rdd2)
joinrdd.collect().foreach(println)
sc.stop()
}
(2)leftOuterJoin rightOuterJoin
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator15")
val sc = new SparkContext(sparkConf)
val rdd1 = sc.makeRDD(
List(("a",1),("b",2),("c",3))
)
val rdd2 = sc.makeRDD(
List(("a",4),("b",5),("c",6))
)
//leftOuterJoin(左链接),rightOuterJoin(右链接)
val joinrdd: RDD[(String, (Int, Option[Int]))] = rdd1.leftOuterJoin(rdd2)
val joinrdd1: RDD[(String, (Option[Int], Int))] = rdd1.rightOuterJoin(rdd2)
joinrdd1.collect().foreach(println)
sc.stop()
}
(3)cogroup
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator15")
val sc = new SparkContext(sparkConf)
val rdd1 = sc.makeRDD(
List(("a",1),("b",2),("c",3))
)
val rdd2 = sc.makeRDD(
List(("a",4),("b",5),("c",6),("c",7))
)
//cogroup将一个数据源中的相同key放在一个组中,然后与另一个数据源链接
val cgrdd: RDD[(String, (Iterable[Int], Iterable[Int]))] = rdd1.cogroup(rdd2)
cgrdd.collect().foreach(println)
sc.stop()
}
(4)案例
统计出每一个省份每个广告被点击数量排行的 Top3
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator15")
val sc = new SparkContext(sparkConf)
//尚硅谷的案例实操
//读取数据
val data: RDD[String] = sc.textFile("data/agent.log")
//将数据的结构转换,取得省份和广告
val maprdd: RDD[((String, String), Int)] = data.map(
line => {
val datas = line.split(" ")
((datas(1), datas(4)), 1)
}
)
//转换后的数据进行分组聚合
val reducerdd: RDD[((String, String), Int)] = maprdd.reduceByKey(_ + _)
//聚合后的结果进行结构转换
val maprdd2: RDD[(String, (String, Int))] = reducerdd.map {
case ((shenfen, guangao), sum) => {
(shenfen, (guangao, sum))
}
}
//转换后的数根据省份进行分组
val grouprdd: RDD[(String, Iterable[(String, Int)])] = maprdd2.groupByKey()
//分组后的数据进行组内排序,并且取前3名
val resultrdd: RDD[(String, List[(String, Int)])] = grouprdd.mapValues(
iter => {
iter.toList.sortBy(_._2)(Ordering.Int.reverse).take(3)
}
)
resultrdd.collect().foreach(println)
resultrdd.saveAsTextFile("output")
sc.stop()
}