Hive学习笔记(一)
一、Hive简介
Hive是基于HDFS的一个数据仓库,它可以提供hql语句通过解释器映射成MapReduce任务完成提取、转换、加载(ETL)操作
二、Hive架构
- CLI,Shell 终端命令行(Command Line Interface),采用交互形式使用 Hive 命令行与 Hive 进行交互
- JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客户端
- 通过浏览器访问 Hive
- driver,驱动器
- 解释器 对用户输入的SQL语言进行词法和语法解析,将SQL语句转化为抽象语法树的形式
- 编译器 编译器是将语法树编译为逻辑执行计划
- 优化器 优化器是对逻辑执行计划进行优化
- 执行器 执行器是调用底层的运行框架执行逻辑执行计划
- Metastore 表名,列和分区属性(名称,长度,描述等等),表数据所在目录,默认存在Derby 中,不支持多用户,使用MySQL代替
三、Hive相关重要概念
1. 建表语句:
hive> create table user(id int,
> name string,
> age int,
> tele string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY '\t'
> STORED AS TEXTFILE;
导入数据To表:load data local inpath '/home/wyp/data/user.txt' into table user;
从本地文件系统导入数据到Hive,会先复制到HDFS中,再从HDFS将数据导入表中,表的数据默认存在hive-site.xml配置文件的hive.metastore.warehouse.dir属性指向路径中,Hive每创建一个表会在该目录下创建一个文件夹,将数据存在该文件中。
2. 内部表,外部表
外部表建表在表名前面加上external字段即可
删除内部表,如果hadoop垃圾箱没有开启,会删除元数据和表数据,垃圾箱开启只会删除元数据,同时会将表数据移动到Current文件夹下。
删除外部表,会删除元数据,但是不会删除表数据
3. 分区
//创建一个分区表,分区的单位时dt和国家名
hive> create table logs(ts bigint,line string) partitioned by (dt String,country string);
分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,提高查找效率
Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值,要估算号分区数量,防止目录创建过多
Hive查询通常使用分区的列作为查询条件
4. 分桶
建表语句带有分桶:
create table student(
id int,
age int,
name string
)
partitioned by (stat_date string)
clustered by (id) sorted by(age) into 2 bucket
row format delimited fields terminated by ',';
桶为了表提供了额外的结构,Hive在处理某些查询时利用这个结构,能给有效地提高查询效率
桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件
Hive特点
优点:
- 高扩展性
- 适合大数据批量操作
- 延伸性较好,支持自定义函数
- 良好的容错性
缺点:
- Hive 不支持记录级别的增删改操作
- 延时很高
- 不支持事务