一、提出任务
- 有多科成绩表,比如python.txt、spark.txt、django.txt,计算每个学生三科平均分
- Python成绩表 - python.txt
-
1 张三 89 2 李四 90 3 王五 89 4 赵六 70 5 叶凡 79 6 石昊 97 7 楚阳 79 8 李天命 86
- Django成绩表 -django.txt
-
1 张三 89 2 李四 90 3 王五 89 4 赵六 70 5 叶凡 79 6 石昊 97 7 楚阳 79 8 李天命 86
- Spark成绩表 -spark.txt
-
1 张三 89 2 李四 90 3 王五 89 4 赵六 70 5 叶凡 79 6 石昊 97 7 楚阳 79 8 李天命 86
预备工作:启动集群的HDFS与Spark
-
在HDFS上新建/score目录
-
在master虚拟机上新建一个file文件,在file创建三个成绩文件
将文件上传到hdfs上的score目录下 -
查看文件内容
二、完成任务
(一)新建Maven项目
- 设置项目类型
-
scala目录(用的以前的gif不会影响)
(二)添加相关依赖和构建插件
- 在pom.xml 添加依赖
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.cch.sql</groupId> <artifactId>SparkSQL</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.11.12</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.1.1</version> </dependency> </dependencies> <build> <sourceDirectory>src/main/scala</sourceDirectory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.3.2</version> <executions> <execution> <id>scala-compile-first</id> <phase>process-resources</phase> <goals> <goal>add-source</goal> <goal>compile</goal> </goals> </execution> <execution> <id>scala-test-compile</id> <phase>process-test-resources</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
(三)创建日志属性文件
- 添加log4j.properties日志文件
-
log4j.rootLogger=ERROR, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spark.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
(四)创建计算平均分单例对象
- 在net.cch.ssql包里创建CalclateAverageBySQL单例对象
package net.cch.sql
import org.apache.spark.sql.{Dataset, SparkSession}
/**
* 功能: 使用Spark sql计算多表平均分
* 作者: 陈春宏
* 时间: 2022年06月10日
*/
object CalculusAverageBySQL {
def main(args: Array[String]): Unit = {
// 创建或得到Spark会话2对象
val spark = SparkSession.builder()
.appName("CalculusAverageBySQL")
.master("local[*]")
.getOrCreate()
// 读取HDFS上的成绩文件
val lines = spark.read.textFile("hdfs://master:9000/score")
import spark.implicits._
// 创建成绩数据集
val gradeDS: Dataset[Score] = lines.map(
line => {
val fields = line.split(" ")
val id = fields(0).toInt
val name = fields(1)
val score = fields(2).toInt
Score(id,name, score)
}
)
//显示成绩数据集内容
//将数据转换成数据帧
val df = gradeDS.toDF();
// 创建临时表,计算平均分
df.createOrReplaceTempView("t_Score")
//查询临时表,计算平均分
//cast(AVG(score) AS decimal(5,2)) as average
val avg = spark.sql(
"""
|select first(id) as id,name, cast(avg(score) as decimal(5, 2)) as average
| FROM t_Score
| GROUP BY name
| ORDER BY id
|""".stripMargin
)
avg.collect.foreach(row => println(row(0) + " " + row(1) + " " + row (2)))
}
case class Score(id:Int,name:String,score:Int)
}
(五)本地运行程序,查看结果
- 在控制台查看输出结果