文章目录
-
hIve的hql的u数据类型和java中的基本数据类型差不多,但是data类型的格式必须为YYYY-MM-DD
-
建立hive表时,如果不知道数据类型,用string,便于向其他形式的转化
-
Date 类型的格式需为YYYY-MM-DD。
-
MySQL的执行顺序:
from=》where=》group by =》having=》select=》order by=》limit -
hive的执行语句
from=》where=》select=》group by=》having =》orderby=》limit
1.map阶段
- 1)from 先从表中加载数据
- 2)where进行筛选过滤条件
- 3)查询出来=>select
- 4)分组=>group by
- 5)map端输出
2.reduce阶段
- 对map的输出进行分组
- 查询=》select
- 限制输出=》limit,order by
3.where
- 分区字段当普通字段使用,后面不能跟子查询
- 分区裁剪:
select * from emp_p_2 where dt >=“2020-10-14” and dt <= “2020-10-16”;
2.join
- 先过滤,能过滤的就过滤,再join,尽可能的减少连接数量。
- 有join必定需用到reduce
join:inner join 两表中共有行数进行join,输出为两表中共有的行数为准
left join:以左表的行数为准,右表没有的补NULL
right join:以右表为准,左表没有补NULL
查询每个员工的上司
select p1.name,p3.boss from emp_b_p2 p1 join (select p2.name boss,p2.id from emp_b_p2 p2) as p3 on p1.mgr=p3.id;
3.group by
- 在hive中group by 跟的是mapreduce过程中map输出的key。
- select中维度字段和聚合字段出现的时候,维度字段要都出现在group by 后面
- 用到group by 必有reduce
从事每个工作的人数
select count(job) from emp_b_p group by job;
4.order by
- 全局排序,要尽量避免全局排序,因为数据量很多,即对所有的reduce输出是有序的
- 可以用distribute by sort by代替order by 全局排序,效率更高
以下测试发现两个结果是一样的
5.sort by
单个reduce输出有序,当有多个reduce输出时,会将单个reduce的结果有序输出,不能保证全部的reduce输出是有序的
6.if(判断条件,成立的返回值,否则的返回值)
7.case when xx then yy else zz end
8、函数
1)split
语法: split(string str, string pat)
返回值: array
pat 为分割符
2)concat_ws
语法: concat_ws(string SEP, string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符
3)datediff
语法: datediff(string enddate, string startdate)
返回值: int
说明: 返回结束日期减去开始日期的天数。
4)concat
语法: concat(string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,支持任意个输入字符串
5)向下取整函数floor
语法: floor(double a)
返回值: BIGINT
说明: 返回等于或者小于该double变量的最大的整数
6)日期增加函数date_add
语法: date_add(string startdate, int days)
返回值: string
说明: 返回开始日期startdate增加days天后的日期。
7)类型转换函数cast
类型转换函数: cast
语法: cast(expr as )
8) explode: 行转列
使用于wordcount的场景
select explode(split(line,",")) from line;
9)列转行concat_ws和collect_list,collect_set配合使用
- collect_set:对列数据去重后返回
- collect_list:对列数据不去重返回
注意:创建表时以什么符分割,这里的连接符就用什么
select concat_ws(’,’,collect_set(name)) from emp;
9.窗口函数
row_number、rank、dense_rank
- row_number()从1开始,按照顺序,生成分组内记录的序列,row_number()的值不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列
- RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位
- DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位
- 窗口函数一般适合分区的场景
select emp.sal,emp.id row_number() over(order by sal) as rn from emp;
加个分区便于查看,这里不能用group 要用partition,尽管不是分区表也可以使用
row_number()
组内依次排名,不会产生并列,不会有空位
select emp.sal,emp.job ,row_number() over(partition by job order by sal) as rn from emp;
RANK()
- 相同会并列,产生排名空位
select emp.sal,emp.job ,RANK() over(partition by job order by sal) as rn from emp;
DENSE_RANK()
- 会并列,不会产生空位
select emp.sal,emp.job ,DENSE_RANK() over(partition by job order by sal) as rn from emp;
java
java入门基础学习(一)
java入门基础学习(二)
java入门基础学习(三)
java入门基础学习(四)
java入门基础学习(五)
java入门基础学习(六)
java入门基础学习(七)
java入门基础学习(八)
java入门基础学习(九)
java入门基础学习(十)
java入门基础学习(十一)
java入门基础学习(十二)
java入门基础学习(十三)
java入门基础学习(十四)Maven Git
java总结,题目+笔记
java进阶之常见对象(一)
java进阶之常见对象(二)
java进阶之冒泡排序
java进阶之选择排序
java进阶之面向对象(封装)
java进阶之面向对象(代码块、继承)
java进阶之面向对象(多态、抽象、接口)
java进阶之匿名内部类、访问修饰符、包
java进阶之io流(字节流,字符流)
java应用一(反射的应用)
java应用二(配置文件、工具类)
java应用三(数据库索引、spring)
java应用四(连接池)
Linux
Linux基础一
Linux基础二
Mysql
mysql一
mysql二
mysql三
mysql四
java连接数据库
redis
redis一(缓存,redis简介)
redis二(单节点安装,桌面插件)
redis三(指令的使用)
redis四(java与redis的连接,基本指令在java中的操作)
redis五(练习)
redis七(持久化)
redis九(集群安装)
Hadoop
hadoop学习一
hadoop学习二
hadoop学习三
hadoop学习四
hadoop学习五
hadoop学习六
hadoop学习七
hadoop学习八
hadoop异常处理
hadoop基础学习九
hadoop基础学习十