首先看表内容:(这里用txt来记录)
score表
第一列是学生id 第二列是课程id 第三列是分数
需求是:查询至少有一门课与学号为" 1 "的同学所学相同的同学的信息
思路一:
思路就是连接 把01课程上的课程id找出来 发现是一列 可以转成一行(思路二)这里只需要连接即可 就只要和其他同学上的课程id连接 但凡有连接上的说明就有上的课程相同的 然后去重学生id即可
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("exp01")
val sc = new SparkContext(conf)
val scoreRDD = sc.textFile("file:///d:/exp/score.txt")//连接
//把id为1上的课程筛选出来 课程id作为元组的第一个元素 随便取个1作为第二个元素
//因为join的前提是必须是二元元组 凑个1
var s2 = scoreRDD.map(line => {
val infos = line.split(",")
(infos(0), infos(1))
}).filter(_._1.equals("1")).map(x=>(x._2,1))
//两表连接
scoreRDD.map(line => {
val infos = line.split(",")
(infos(0), infos(1))}).map(x=>(x._2,x._1)).
join(s2).map(x=>x._2._1).distinct().foreach(println)
思路二:
就是你把查出来的id为1的课程号变成一行 因为你正常filter出来的是一列 办法就是group by
group by sid 以后我们发现每个sid后面会跟一个迭代器 迭代器包括上的cid 然后转list foreach取出来就好