Day44[20180719]_Spark SQL(三)

-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))

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值