-1.Scala语言基础
Spark大数据分析框架使用Scala语言编写
-2.SparkCore
类似MapReduce 海量数据处理并行计算框架
数据结构:RDD(弹性分布式数据集)
-i.特征(五个特征,前三个是核心)
-a. List<Partition>
-b.Compute Split
-c.List<RDD>
-d.Optional,RDD[(Key,Value)]
可以设置分区器Partition
-e.Optional,Performered Location
处理数据的最佳位置
-iii.处理分析数据
RDD#transformation函数,大多数都是高阶函数
flatMap,map,filter、groupByKey、sortByKey、reduceByKey、coalose、
aggegateByKey。。。。
-iv.数据结果处理
RDD#action函数,向Driver返回结果或保存数据
count\first\foreachPartition
-v.持久化函数
将RDD数据存储到内存或磁盘中,设置副本数
-3.Spark SQL
针对结构化数据的处理模块,企业中使用非常非常多
SparkSession:spark
-i.数据结构:
DataFream/Dataset = RDD+schema
-ii.外部数据源接口
spark.read.option("","").load
dataframe/dataSet.writer.mode().option().save
-iii.前世今生
Hive->Spark->SparkSQL->2.0
Hive中所有的功能,在SparkSQLz中都有
将SparSQL与hive集成
在SparkSQL进行数据分析的时候,无论使用SQL分析还是DSL分析,经常使用函数,方便对数 据处理
启动mestore服务
更换数据库为metasotre
将Spark当做服务启动起来
这时候SparkSQL就与hive集成了,可以读取hive表中的数据
create table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
row format delimited fields terminated by '\t';
create table dept(
deptno int,
dname string,
loc string
)
row format delimited fields terminated by '\t';
LOAD DATA LOCAL INPATH '/opt/datas/emp.txt' INTO TABLE emp ;
LOAD DATA LOCAL INPATH '/opt/datas/dept.txt' INTO TABLE dept;
查看一张表的详细信息
将数据缓存到内存中
关闭thriftserver服务
内置函数
org.apache.spark.sql.functions
窗口函数,方便统计分析
高级函数 与Oracle/DB2数据库中的函数,主要为了金融行业提供复杂的数据分析报表
row_number()\rank()\dense_rank()
窗口函数
ROW_NUMBER:
分组组内给序号
从字面的意思看,一个虚拟的数字,给每一行进行一个编号
需求:
获取EMP表中各个部门人员薪资最高的三个分的姓名、薪资和部门名称
SELECT
empno, ename, sal, deptno,
ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal DESC) AS num
FROM
default.emp ;
需求:获取每个部门中工资前三名的员工
SELECT
t.empno, t.ename, t.sal, t.deptno
FROM(
SELECT
empno, ename, sal, deptno,
ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal DESC) AS num
FROM
default.emp
)t
WHERE
t.num <= 3 ;
需求:在上个需求上添加部门名称
SELECT
tt.empno, tt.ename, tt.sal, d.dname
FROM(
SELECT
t.empno, t.ename, t.sal, t.deptno
FROM(
SELECT
empno, ename, sal, deptno,
ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal DESC) AS num
FROM
default.emp
)t
WHERE
t.num <= 3
) tt
JOIN
dept d
ON
tt.deptno = d.deptno ;
分析函数
分析函数:加上序号
row_number()\rank()\ dense_rank()
三个排序分析函数的区别
SELECT
empno, ename, sal, deptno,
ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal DESC) AS num
FROM
default.emp ;
SELECT
empno, ename, sal, deptno,
RANK() OVER(PARTITION BY deptno ORDER BY sal DESC) AS num
FROM
default.emp ;
SELECT
empno, ename, sal, deptno,
DENSE_RANK() OVER(PARTITION BY deptno ORDER BY sal DESC) AS num
FROM
default.emp ;
SELECT
empno, ename, sal, deptno,
ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal DESC) AS row_num,
DENSE_RANK() OVER(PARTITION BY deptno ORDER BY sal DESC) AS dense_num,
RANK() OVER(PARTITION BY deptno ORDER BY sal DESC) AS rank_num
FROM
default.emp ;
注意:function中还有其他的排序函数后期研究
自定义函数
1、一对一 UDF
spark.udf.register(
"toUpper",// function name
( word:String) => word.toUpperCase() //匿名函数
)
2、多对一 UDAF
聚合函数,通常和groupByKey在一起使用
需求:求各个部门的平均工资(avg(sal))