目录
一:hive介绍
1.hive本质:将HQL转化为MapReduce程序
2.hive中不走MR,走元数据
3.基本数据类型:INT,BIGINT,DOUBLE,STRING
hive的string类型相当于数据库中的varchar类型
4.hive中集合数据类型有
Map, Array, Struct
支持类型转换
二:创建测试表
create table test(
name string,
friends array<string>,
children map<string,int>,
address struct<street:string,city:string>
)
row format delimited fields terminated by ',' --列分隔符
collection items terminated by '_' -- 数据分隔符
map keys terminated by ':' -- map中key,value分隔符
lines terminated by '\n'; --行分隔符
导入文本数据到测试表
load data local inpath '/opt/module/hive/test.txt' into table test;
三:类型转换
可以使用cast('1' as INT)把字符串’1‘转换为整数1;如果强制类型转换失败
四:操作
1.上传文件到HDFS
dfs -put /opt/module/hive/data/student.txt /user/atguigu/hive
2.Import数据到指定Hive表中
注意:先用export 导出后,再将数据导入。
import table student2 from '/user/hive/warehouse/export/student';
3.hadoop命令导出到本地
dfs -get /user/hive/warehouse/student/student.txt /opt/module/data/export/student3.txt;
五 排序
1.全局排序:order by ,只有一个Reducer
2.每个Reduce内部排序 Sort by. sort by 产生一个排序文件。每个Reducer内部进行排序,对全局结果集来说不是排序。
设置reduce个数:set mapreduce.job.reduces = 3;
eg:select * from emp sort by deptno desc;
六 分区
distribute by :在有些情况下,我们需要控制某个特定行应该到那个reducer,通常是为了进行后续聚集操作。
distribute by 类似于MR中partition(自定义分区),进行分区,结合sort by使用。
补充:
当distribute by 和sort by字段相同的时候,可以使用cluster by.
cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序只能是升序 排序,不能指定排序规则为 ASC 或者 DESC
为什么要分区:
防止进行不必要的全表扫描。
七 函数
1.explode(col) : 将hive一列中复杂的Array或者Map结构拆分成多行。
使用Lateral View可以与之前的原始列关联起来。
2.窗口函数
OVER():指定分析函数工作的数据窗口大小。
3.Rank函数
DENSE_RANK() :排序相同时,会重复、总数会减少。1,1,2
Rank() :排序相同时,会重复,但是总数不会变。 1,1,3
ROW_NUMBER(): 会根据顺序计算。1,2,3
select name , subject, score,
rank() over (partition by subject order by score desc) rp,
dense_rank() over(partition by subject order by score desc) drp,
row_number() over(partition by subjectorder by score desc) rmp
from score;
八:自定义函数
UDF
UDAF
UDTF
九:压缩格式
lzo 可切分
Snappy 不可切分
十:文件存储格式
Hive支持的存储数据的格式主要有:textfile, squencefile, parquet
十一:企业级调优
1.Fetch抓取:Hive中对某些情况的查询可以不必使用MapReduce计算。
2.本地模式:对于小数据集,执行时间可以明显缩短。
3.小表大表join时候,小表放在左边
4.Count(distinct)去重统计
5.尽量避免笛卡尔积
6.行列过滤
列处理:只拿只需要的列,如果有分区,尽量使用分区过滤,少用select *
行处理:在分区裁剪中,当使用外关联的时候,如果将副表的过滤条件
写在where后面,那么就会完全失去全表关联
7.分区
8分桶
9合理设置Map以及Reduce个数
10.并行执行
11,严格模式:通过设置放置一些危险操作。