第一章、基础知识
1、Hive诞生背景
Hive的出现是为了解决存储在HDFS之上的结构化和半结构化数据的存储和分析,通过他所提供的类似与SQL的HQL方便SQL用户有效的使用数据模型
2、Hive使用场景
Hive最适合于数据仓库应用程序,使用该程序进行相关的静态数据分析,不需要快速的相应给出结果,而且数据本身不会频繁的发生变化
3、Hive缺点
Hive不是一个完整的数据库
Hive不支持记录级别的更新、插入、删除操作
Hive查询延时较大
Hive不支持事务
Hive不符合ANSI SQL标准
4、Hive底层依赖
MapReduce:
是一种计算模型,该模型可以将大型数据处理任务分割成很多单个、可以在服务器集群中并行的执行的任务
HDFS:
Hadoop之上的分布式文件系统,通常默认每个块是64M或者它的整数倍,这样保证最小的磁盘寻址次数进行写入和读取,从而提高性能,同时每份数据会冗余多份
5、Hive的替代工具
Pig:是一种数据流语言,用户需要定义一些列的声明语句来定义某些关系之间的联系,每个新的关系都会执行新的数据转换过程,Pig会查找这些声明,然后创建一些有序的MapReduce任务
HBase:是一个分布式、可伸缩的数据存储、其支持行级别的数据更新、快速查询、行级事务
第二章、基础操作
1、Hive命令
- 启动:hive
- hive -help
2、beeline使用
- jdbc:hive2://10.100.3.112:10000
3、hcat命令行
hcat { -e "<query>" | -f "<filepath>" } [ -g "<group>" ] [ -p "<perms>" ] [ -D"<name>=<value>" ]
选项 | 描述 | 实例 |
-e | 通过命令行执行DDL语句 | hcat -e "show tables" |
-f | 执行包含DDL语句的脚本 | hcat -f xx.sql |
-g | 为创建的表指定组 | hcat -g mygroup |
-p | 为创建的表指定目录权限 | hcat -p rwxr-xr-x |
-D | 将键值对以java系统属性传递给HCatalog | hcat -D log.level=INFO |
-h | 提示用法帮助信息 | hcat -h或 hcat |
4、hive参数的传递
- -hivevar tbname='t4' -hivevar count=10 -e 'select * from ${hivevar:tbname} limit ${hivevar:count}'
- -hivevar tbname=’a’ -hivevar count=10 -f filename.hql
- -hiveconf tbname=’a’ – hiveconf count=10 -f filename.hql
- -hiveconf tbname=’a’ -hiveconf count=10 -e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’
5、辅助命令
- :提示hive中能够支持的函数和运算符
- functions:显示所有的函数
- function 函数名:提示函数的解释信息
第三章、数据类型和文件格式
1、基本数据类型
数据类型 | 长度 | 实例 |
TINYINT | 1byte有符合整数 | 20 |
SMALINT | 2byte有符合整数 | 20 |
INT | 4byte有符合整数 | 20 |
BIGINT | 8byte有符合整数 | 20 |
BOOLEAN | 布尔类型,true,false | true |
FLOAT | 单精度浮点数 | 3.14159 |
DOUBLE | 双精度浮点数 | 3.14159 |
STRING | 字符串,可以使用单引号或者双引号 | 'zhangsan' ,"zhangsan" |
TIMESTAMP | 整数,浮点数或者字符串 | |
BINARY | 字节数组 |
2、集合数据类型
数据类型 | 描述 | 实例 |
STRUCT | 和C语言中的struct或者对象类似,都可以通过点符号来访问元素内容,例如,如果某个列的数据类型是STRUCT{first STRING,last STRING},那么第1个元素可以通过 字段.first来应用 | struct('john','doe') |
MAP | MAP是一组键值对元组集合,使用元组表示法(例如['key'])可以访问元素。例如如果某个列的数据是MAP,那么可以通过字段名['key']来访问 | map('first','john','last','doe') |
ARRAY | 数组是一组具有相同类型和名称变量的集合,这些变量称为数组的元素,数组从0开始 | Array('john','doe') |
第四章、数据定义
1、Hive中数据库
Hive中数据库的概念本质上仅仅是表的一个目录和命名空间,Hive会为每个数据库创建一个目录,数据库中的表会以目录中的子目录的形式存储
2、Hive数据库目录的位置
这个目录可以设置,hive.metastore.warehouse.dir,默认目录是/user/hive/warehouse,数据库的目录默认以.db结尾
3、Hive中数据库创建
- 命令进入后默认是default库
- create database [IF NOT EXISTS ] 表名;
- show databases;
- show databases Like/RLike '*字符*'
- use 库名
- set hive.cli.print.current.db=true
- drop database [IF EXISTS] 表名 [CASCADE] (加上这个参数会先删除库里面的表数据,在删除库)
4、Hive中表的创建
- create table [if not exists] 表名(id INT);
- 对传统的SQL进行了扩展,比如增加了位置存储,以及存储的格式
- 自动给表增加两个属性,一个是last_modified_by(最后一次修改表的用户),last_modified_time(最后一次修改表时间)
- create table if not exists 表名 like 表名
- show tables [in 库名];
- show tables '*字符*’
- describe [formatted/extended] 表名
5、Hive中表分类
- HQL语句并不适合外部表,而且删除的数据数据不会删除
- create external table stocks(id String,name String) row format delimited fields terminated by ',' location '路径'
-
- table employees(id String,name String) partitioned by (age String);
-
- show partitions 表名;
6、自定义存储格式
- stored as textfile
- SEQUENCEFILE和RCFILE
- DerDe
第五章、HiveQL数据操作
1、向表中装载数据
- data [local] inpath '${env:HOME}/路径' overwrite into table 表明 [partition (id ='字段名')]
- :表示的本地路径还是hdfs路径
- :有就覆盖,没有就写入
- :可以是一个目录,但是里面不能有文件夹
2、通过查询向表中增加数据
- overwrite/into table 表明 select * from 表名
- :会覆盖里面的内容
- :表示数据的追加
3、动态分区插入
- overwrite table 表名 partition(country,state) select ... se.cnty,se.st from 表名 se
- 最后两列来确定分区字段的值
4、单个查询语句中创建表并加载数据
- table 表名 AS select 字段 from 表名
5、导出数据
insert overwrite local directory '路径' select 字段 from 表名