Hive源数据默认存储在derby数据库中,不支持多客户端访问,所以需要将源数据存储在Mysql中,才支持多客户端访问。主要架构如下:
HIVE解析成MR的过程:
Hive通过给用户提供一系列交互接口,接受到用户的指令(sql语句),结合源数据(metastore),经过Driver内的解析器、编译器、优化器、执行器转换成MaoReduce(将sql转换成抽象语法树AST的解析器,将AST编译成逻辑执行计划的编译器,在对逻辑执行计划进行优化的优化器,最后将逻辑执行计划转换成MapReduce),提交给hadoop中执行,最后将执行返回的结果输出到用户交互接口。
2.Hive与传统数据库的区别
Hive和数据库除了用户类型的查询语言外,无其他相似
1.存储位置:Hive数据是存储在HDFS上。数据库保存在块设备或本地文件系统
2.数据更新:Hive不建议对数据改写。数据库通常需要经常修改
3.执行引擎:Hive通过MapReduce来实现。数据库用自己的执行引擎
4.执行速度:Hive执行延迟高,但它数据规模远超过数据库处理能力时,Hive的并行计算能力就体现了优势,数据库执行延迟较低
5.数据规模:Hive大规模的数据计算,数据库能支持的数据规模较小
6.扩展性:Hive建立在Hadoop上,随Hadoop的扩展性。数据库由于ACID语义的严格限制,扩展有限
A(atomicity)原子性:事务操作要么全部做完,要么不做。
C(consistency)一致性:事务运行期间,数据对象依然完整性
I(isolation)独立性:并发事务之间不会相互影响
D(druability)持久性:一旦事务提交后,修改将永久保存在数据库上
3.Hive内部表和外部表的区别
1.存储:外部表数据又HDFS管理;内部表数据又Hive自身管理
2.存储:外部表数据存储位置由自己指定(没有指定lication则在默认地址下新建);内部表数据存储在hive.metastore.warehouse.dir(默认在/usr/hive/warehouse)
3.创建:被external修饰的就是外部表;没被修饰的是内部表
4.删除:删除外部表仅仅删除元数据;删除内部表会删除元数据和存储数据
4.Hive中order by,sort by ,distribute by 和cluster by的区别
1.order by :对数据进行全局排序,只有一个reduce工作
2.sort by:每个mapreduce中进行排序,一般和distribute by使用,且distribute by写在sort by前面,当mapred.reduce.tasks=1时,效果和order by一样
3.distribute by:类似MR的Partition,对key进行分区,结合sort by实现分区排序
4.cluster by:当distribute by和sort by的字段相同时,可以使用cluster by代替,但cluster by只能是升序,不能指定排序规则
注意:在生产环境中order by使用的少,容易造成内存溢出(OOM)
生产环境中distribute by 和sort by用的多
5.row_number(),rank()和dense_rank()的区别
row_number():根据查询结果的顺序计算排序,多用于分页查询
rank():排序相同时序号重复,总序数不变
dense_rank():排序相同的序号重复时,总序数减少
select name,subject,score row_number() over(partition by subject order by score desc) rn, rank() over(partition by subject order by score desc) r, dense_rank() over(partition by subject order by score desc) dr from student_score;
6.Hive中常用的系统函数
1.date_add(str,n),date_sub(str,n) 加减时间
2.next_day(to_date(str,‘MO‘) 周指标相关,获取str下周一日期
3.date_format*=(str,‘yyyy‘) 根据格式整理日期
4.last_day(to_date(str)) 求当月最后一天日期
5.collect_set(col)收集数据返回一个以逗号分隔的字符串数组
6.get_json_object(jsonstr,;$.object‘) 解析json,使用 $.object获取对象值
7.NVL(str,replace) 空字段赋值,str为空返回replace值;两个都为空则返回null
7.Hive如何实现分区
1.建表:create tbale tablename(col1 string) partitioned by (col2 string);
2.添加分区:alter table tablename add partition(col2=‘202101‘)
3.删除分区:alter table tablename drop partition(col2=‘202101‘)
8.Hive导入数据的五种方式
1.Load:可以从本地或HDFS上导入,本地是copy,HDFS是移动
本地:load data local inpath ‘/root/student.txt‘ into table student;
HDFS:load data inpath ‘/usr/hive/data/student.txt‘ into table student;
2.insert:往表里插入
insert into table student values(1,‘zhangsan‘);
3.as select方式,根据查询结果创建表并插入数据
create table if not exists stu1 as select id,name from student;
4.location,创建表并指定数据的路径
create external if not exists stu2 like student lication ‘/usr/hive/warehouse/student/student.txt‘;
5.import,先从hive上使用export导出再导入
import table stu3 from /usr/export/student‘
9.Hive导出数据的五种方式
1.insert 查询结果导出到本地或HDFS
insert overwrite local directory ‘/root/insert/student‘ select id ,name from student;
insert overwrite directory ‘/usr/insert/student‘ select id, name from student;
2.hadoop命令导出本地
hive> dfs -get /usr/hive/warehouse/student/00000_0 /root/hadoop/student.txt
3.hive Shell命令导出
$ bin/hive -e ‘select id,name from student;‘ >/root/hadoop/student.txt
4.Export导出到HDFS
hive>export table student to ‘/usr/export/student‘;
5.Sqoop导出
10.自定义UDF,UDTF函数
用UDF函数解析公共字段,用UDTF函数解析事件字段
自定义UDF:继承UDF,重写evaluate方法
自定义UDTF:继承GenericUDTF,重写3个方法:initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close
Hive自定义函数包括三种UDF、UDAF、UDTF
UDF(User-Defined-Function) 一进一出
UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出。Count/max/min
UDTF(User-Defined Table-Generating Functions) 一进多出,如lateral view explore()
使用方式 :在HIVE会话中add 自定义函数的jar文件,然后创建function继而使用函数