需求:
只统计年龄在20岁以上的员工
根据部门名称和员工性别为粒度来进行统计
统计出每个部门分性别的平均薪资和年龄
Scala代码示例
package cn.study.spark2
import org.apache.spark.sql.SparkSession
/**
* 计算部门的平均薪资和年龄
*
* 需求:
* 1、只统计年龄在20岁以上的员工
* 2、根据部门名称和员工性别为粒度来进行统计
* 3、统计出每个部门分性别的平均薪资和年龄
*
*/
object DepartmentAvgSalaryAndAgeStat {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("DepartmentAvgSalaryAndAgeStat")
.master("local")
.config("spark.sql.warehouse.dir", "C:\\Users\\htfeng\\Desktop\\spark-warehouse")
.getOrCreate()
// 导入spark的隐式转换
import spark.implicits._
// 导入spark sql的functions
import org.apache.spark.sql.functions._
// 首先将两份数据文件加载进来,形成两个dataframe(讲的是untyped类型的操作入门)
val employer = spark.read.json("C:\\Users\\htfeng\\Desktop\\employee.json")
val department = spark.read.json("C:\\Users\\htfeng\\Desktop\\department.json")
// 进行计算操作
employer
// 先对employee进行过滤,只统计20岁以上的员工
.filter("age > 20")
// 需要跟department数据进行join,然后才能根据部门名称和员工性别进行聚合
// 注意:untyped join,两个表的字段的连接条件,需要使用三个等号
.join(department, $"depId" === $"id")
// 根据部门名称和员工性别进行分组
.groupBy(department("name"), employer("gender"))
// 最后执行聚合函数
.agg(avg(employer("salary")), avg(employer("age")))
// 执行action操作,将结果显示出来
.show()
// 基础的知识带一下
// dataframe == dataset[Row]
// dataframe的类型是Row,所以是untyped类型,弱类型
// dataset的类型通常是我们自定义的case class,所以是typed类型,强类型
// dataset开发,与rdd开发有很多的共同点
// 比如说,dataset api也分成transformation和action,transformation是lazy特性的
// action会触发实际的计算和操作
// dataset也是有持久化的概念的
}
}