- 1. Hive是什么?
- 2. 为什么要用Hive?
- 3. Hive有什么特点?(好处)
- 4. Hive的架构?
- 5. HQL转化大致流程
- 6. Hive和Hadoop的关联
- 7. Hive和传统数据库的区别、比较
- 8. Hive *** 作
- 9. Hive内部表和外部表
- 10. Hive DML - 数据 *** 作语言
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类 SQL 查询功能;
本质: 将SQL转换为MapReduce进行运算,底层是由HDFS存储。
2. 为什么要用Hive?我们也可以理解为:Hive是MapReduce的客户端。
学习MapReduce的成本高,而且MapReduce实现复杂的查询功能的开发难度比较大。如果我们使用Hive的话,不用学习怎么写MapReduce程序,减少了学习成本,而且Hive采用的类SQL的语法可以快速开发,易学好上手。
3. Hive有什么特点?(好处)除了前面说的Hive的好处-易上手之外,Hive还有其他的好处(特点):
- 可扩展 : Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务。
- 延展性 : Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函 数。
- 容错性 : 良好的容错性,节点出现问题 SQL 仍可完成执行。
Hive的基本组成:
- 用户接口
- CLI — 是shell命令行;
- JDBC/ODBC — Hive的Java实现;
- WebGUI — 通过浏览器访问Hive;
- 元数据存储
- Hive将元数据通常存储在关系型数据库MySQL中;
- Hive的元数据包括 表的名字,表的列,表的分区,以及表的属性(是否为外部表),表的数据所在目录等等;
- Drive 驱动 – 解析器 --> 编译器 --> 优化器 --> 执行器
- 作用 : 将HQL进行解析,编译,优化,生成执行计划,然后调用底层的MapReduce计算框架;
- 1、客户端连接到HiveSever2,目前大多数通过beeline形式连接。
- 2、提交SQL,通过Drive进行解析、编译、优化逻辑计划,生成物理计划;
- 3、对物理计划进行优化,并提交到执行引擎进行计算;
- 4、返回结果;
6. Hive和Hadoop的关联细节流程:
- 客户端和HiveServer2建立连接,创建会话;
- 提交SQL,转交到Driver进行处理;
- Driver内部会通过解析器对SQL语句进行解析,检验语法是否正确;
- 然后通过编译器对语句进行编译,生成AST tree(抽象语法树);
- 语义分析器会遍历抽象语法树,进一步进行语义分析,这个时候会和Hive metaStore(元数据库)进行通信,来获取相应的信息,抽象成查询块,逻辑计划生成器会遍历查询块,把它们翻译成逻辑 *** 作符,形成 *** 作树;这个时候是没有优化的逻辑计划;
- 优化器会对之前的逻辑计划进行处理,比如进行谓词下推、常量值替换、列裁剪等 *** 作,等到优化后的逻辑计划;
- 语义分析器会对已经优化过的逻辑计划进行处理,通过执行器生成物理执行计划TaskTree;
- 执行器会很据物理执行计划进行优化,然后根据底层不同的执行引擎进行提交;
Hive利用HDFS进行存储数据,利用MapReduce查询分析数据;
Hive和传统数据库除了查询语言类似之外,再无其它共同点;
- 处理数据的规模:Hive是用于海量数据的离线分析,数据量大,而传统数据库数据量小
- 数据存储: Hive是存储到HDFS中,而传统数据库存在本地磁盘;
- 执行引擎:Hive执行引擎是MapReduce,而传统数据库有自己的引擎;
- 执行延迟:Hive延迟大,因为它要走MapReduce,数据库延迟小,但是当数据量特别大时,Hive的并行处理就能体现优势;
- …
1.1 DDL - 数据定义语言
- 创建数据库: create database【if not exits】 数据库名;
- 查看数据库: show database
- 删除空数据库: drop database 【if not exits】数据库名;
- 数据不为空怎么删除此数据库(强制删除): drop database 数据库名 cascade;
- 使用进入数据库:use 数据库名;
- 分区表: partitioned by
- 分区的好处和意义:
- 避免Hive全表扫描,提升查询效率;
- 减少数据冗余,提升指定分区的查询效率;
- 查询时尽量使用分区字段,不适用的话,就会全表扫描;
- 分区表的类型
- 静态分区:手动设置
- 动态分区:通过数据进行判断;
- 怎么建立分区
- 分区的好处和意义:
---创建分区表 partitioned by(分区字段名 分区字段类型) creat table fenqubiao_test( name string comment '名字', class int comment ‘班级’ ) partitioned by(class string) --创建分区表之后,此时没有数据,也没有分区,需要建立分区 --建立分区 ALTER TABLE fenqubiao_test add partition(class='105') -- 查看表 现有的分区 show partitions fenqubiao_test; -- 静态分区添加数据 insert into table fenqubiao_test partition(class='105')values('xiaoran','120'); insert into table fenqubiao_test partition(class-'105') select name,class from info; -- 本地文件加载 load data local inpath'/local/wenjian/m.txt' into table fenqubiao_test partition(calss='105');
- 分桶表:cluster by
-- 分区表的创建 creat table 表名(字段1 类型1,字段2,类型2) clustered by(表内字段); -- 创建分桶表 create table buckets_test( sku_id sring comment'商品id', sku_name string comment'商品名称') clustered by(sku_id) into 3 buckets; -- 设置自动分桶开关 set hive.enforce.bucketing=true; -- 为分桶表添加数据 insert into buckets_test select sku_id ,sku_name from sales_info;
补充:
创建表的数据类型有哪些?
- 数字类型:tinyint,smallint,int,bigint,float,double,decimal;
- 日期时间类:timestamp,date,inteval
- 字符串类:string,varchar,char;
- 布尔类型:Boolean
5.复合类型: array(数组),map(键值对),struct(结构体);
.
创建表需要指定分隔符,常见的特殊分隔符^A ^B ^C
**^A **:默认情况下,字段与字段;
** ^B : 每个元素的分隔符
** ^C:map的分隔符
字段分隔符 files terminal by ‘/t’
array类型分隔符 collection items terminal by ‘/t’
1.2 D
9. Hive内部表和外部表
由于内部表把原始存储数据以及元数据都删掉了,而外部表仅仅删除了元数据,所以外部表比较安全,相比于内部表,所以实际应用中外部表用的比较多,而内部表可以用于建临时表;
1.1 数据装载
(1) 从本地装载数据
- 普通表:oad data local inpath’数据文件的路径’ 【overwrite】into 表名
- overwrite 关键字表示覆盖原有数据
- 如果没有这个关键词代表添加数据;
- 分区表:load data local inpath’本地文件路径’ 【overwrite】into table 表名 partition(分区字段 = 值);
- 分桶表:load data local inpath’本地文件路径’【overwrite】into table 表名
(2)从HDFS中加载数据
1.linux本地文件上传到HDFS文件系统 hdfs dfs -put 本地文件路径 hdfs路径 hdfs dfs -put '/home/hadoop/datas/products_info.txt' '/datas' 2. 文件数据装载到Hive表中 load data inpath'hdfs数据文件路径' into table 表名; load data inpath'datas/products_info.txt' into table product_info;
1.2 数据的插入
1)普通表
- insert into 表名 values(值);
2)分区表- insert into 表名 partition(分区字段=字段值) values(值);
3)分桶表- insert into 分桶表名 select * from 中间表;
1.3 数据的导出
- 导出到本地文件系统
- insert overwrite local directory ’ 本地文件夹路径 ’ row format delimited fields terminated by ‘ 字段分隔符 ’ 查询语句;
- 导出到HDFS
- insert overwrite local directory ’ 文件夹路径 ’ 查询语句;
1.4 数据删除
删除HIve表
删除所有的数据
- 使用 truncate 仅可以删除内部表的数据,不可以删除表结构;
- truncate table 表名;
- 使用 shell 命令行删除外部表数据(hdfs dfs -rm -r 外部表路径)
- hdfs dfs -rm -r /datas/test_Exteran1/*
删除部分数据
- 有分区的表 有partition表
- 删除具体的partition
- alter table 表名 drop partition(分区字段=‘值’);
- 删除partition内的部分信息(insert overwrite table)
- 重新把对应的partition信息写一遍,通过where来限定需要留下的信息,没有被留下的信息被删除了;
- 没有分区的表 无partition表
- insert overwrite table 表名 select * from 表名 where 条件;
删除整个表
- 使用drop可以删除整个表
- drop table 表名;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)