使用Scala语言通过Spark实现Join

join

join类似于SQL的inner join操作,返回结果是前面和后面集合中配对成功的,过滤掉关联不上的。

leftOuterJoin

leftOuterJoin类似于SQL中的左外关联left outer join,返回结果以前面的RDD为主,关联不上的记录为空。

rightOuterJoin

rightOuterJoin类似于SQL中的有外关联,返回结果以参数也就是右边的RDD为主,关联不上的记录为空

接下来我们通过SQL与代码相结合的方式,了解一下,如何使用Spark实现连接查询

学生信息表:stu_info(stu_id,stu_name,sex,province),数据如下内容:

1,zhangsan,1,zj
2,lisi,0,gs
3,wangwu,1,bj
4,zhaoliu,0,sh

成绩信息score_info(score_id,stu_id,course_name,score_num),数据如下内容:

1,1,yuwen,56
2,1,shuxue,98
3,2,yuwen,76
4,2,shuxue,45
5,3,yuwen,89
6,3,shuxue,99
7,4,yuwen,34
8,4,shuxue,76

需求:实现所有科目、成绩对应的学生姓名、性别、省份

现在我们用Sql来描述一下我们想要的功能:

select 
 stu.stu_id,stu.stu_name,stu.sex,stu.province,score.cource_name,score.score_num 
from 
stu_info stu 
join 
score_info score 
on 
stu.stu_id=score.stu_id

如何使用Scala语言调用Spark函数来实现?

val stuData = sc.textFile(args(0))
val scoreData = sc.textFile(args(1))
val stuRdd=stuData.map(line=>{
  val cells=line.split(",")
  (cells(0),(cells(1),cells(2),(3)))
})
val scoreRdd=scoreData.map(line=>{
  val cells=line.split(",")
  (cells(1),(cells(2),cells(3)))
})
val failedScoreRdd = scoreData.map(line => {
  val cells = line.split(",")
  (cells(0).toInt, cells(1).toInt, cells(2), cells(3).toInt)
}).filter(line=>line._4<60)
val joinRdd=stuRdd.join(scoreRdd)
joinRdd.map(rdd=>{
  val stu=rdd._2._1
  val score=rdd._2._2
  (rdd._1,stu._1,stu._2,stu._3,score._1,score._2)
})
joinRdd.repartition(1).saveAsTextFile(args(2))

查看输出文件:

(4,zhaoliu,0,3,yuwen,34)
(4,zhaoliu,0,3,shuxue,76)
(2,lisi,0,3,yuwen,76)
(2,lisi,0,3,shuxue,45)
(3,wangwu,1,3,yuwen,89)
(3,wangwu,1,3,shuxue,99)
(1,zhangsan,1,3,yuwen,56)
(1,zhangsan,1,3,shuxue,98)

以上为标准非格式化输出,调整代码如下:

val joinRdd=stuRdd.join(scoreRdd).map(rdd=>{
  val stu=rdd._2._1
  val score=rdd._2._2
  s"${rdd._1},${stu._1},${stu._2},${stu._3},${score._1},${score._2}"
})

输出信息如下:

4,zhaoliu,0,3,yuwen,34
4,zhaoliu,0,3,shuxue,76
2,lisi,0,3,yuwen,76
2,lisi,0,3,shuxue,45
3,wangwu,1,3,yuwen,89
3,wangwu,1,3,shuxue,99
1,zhangsan,1,3,yuwen,56
1,zhangsan,1,3,shuxue,98

说明:
通过s""来进行字符串拼接,中间变量可用${变量名}来进行格式化输出
需求:查询未及格信息

select stu.stu_id,stu.stu_name,stu.sex,stu.province,score.cource_name,score.score_num from stu_info stu join score_info score on stu.stu_id=score.stu_id where score.score_num <60

Scala代码如下:

val stuRdd=stuData.map(line=>{
  val cells=line.split(",")
  (cells(0),(cells(1),cells(2),(3)))
})
val scoreRdd=scoreData.map(line=>{
  val cells=line.split(",")
  (cells(1),(cells(2),cells(3)))
}).filter(rdd=>{rdd._2._2.toInt<60})
val joinRdd=stuRdd.join(scoreRdd).map(rdd=>{
  val stu=rdd._2._1
  val score=rdd._2._2
  s"${rdd._1},${stu._1},${stu._2},${stu._3},${score._1},${score._2}"
})

输出信息如下:

1,zhangsan,1,3,yuwen,56
4,zhaoliu,0,3,yuwen,34
2,lisi,0,3,shuxue,45

 

 

本文版权归https://www.mulhyac.com所有,转载请注明出处.

网址:https://www.mulhyac.com

标签:SparkSQLSparkHadoop

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark Scala中的join算子是一种数据转换函数,用于将两个数据集合并成一个新的数据集。在Spark中,join操作可以通过不同的方式进行,包括内连接、左连接、右连接和外连接。 内连接(inner join)是指将两个数据集合并为一个新的数据集,其中只保留两个数据集中都包含的元素。这种连接方式通常用于需要匹配两个数据集中的关键字或条件时。 左连接(left join)是指将两个数据集合并为一个新的数据集,其中保留左侧数据集中所有的元素,同时将右侧数据集中与左侧数据集匹配的元素合并到新数据集中。如果右侧数据集中没有与左侧数据集匹配的元素,则在新数据集中使用null填充。 右连接(right join)是指将两个数据集合并为一个新的数据集,其中保留右侧数据集中所有的元素,同时将左侧数据集中与右侧数据集匹配的元素合并到新数据集中。如果左侧数据集中没有与右侧数据集匹配的元素,则在新数据集中使用null填充。 外连接(outer join)是指将两个数据集合并为一个新的数据集,其中保留左侧和右侧数据集中所有的元素,同时将左侧和右侧数据集中匹配的元素合并到新数据集中。如果左侧或右侧数据集中没有与另一个数据集匹配的元素,则在新数据集中使用null填充。 在Spark Scala中,join算子通常通过调用DataFrame或Dataset API中的join函数来实现。具体实现方式取决于使用的连接方式和数据集类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值