寒假学习进度

今天完成学习了一个案例的实践和一些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()
}
posted @ 2022-01-07 22:00  chenghaixinag  阅读(28)  评论(0编辑  收藏  举报