Hive
定义:Hive是一个基于Hadoop的数据仓库工具,可以将结构化的数据文件映射成一张数据表,并可以提供类似SQL的方式来对数据文件进行读写以及管理,这套Hive SQL简称为HQL,Hive的引擎可以是MR,Spark,Tez
本质:Hive的本质是将HQL转换成MapReduce任务,完成整个数据的分析查询,减少编写MapReduce的复杂度
优点:
1.学习成本低
2.海量数据分析
3.可扩展性
4.延展性
5.良好的容错性
6.统计管理
缺点:
1.Hive的HQL表达能力有限
2.迭代式算法无法表达
3.Hive的效率比较低
4.Hive自动生成的MapReduce作业,通常情况下不够智能化
5.Hive调优比较困难,力度较粗
Hive的架构:
Hive的用户连接接口层:CLI(Command Line Interface)最常用,JDBC/ODBC,WebUI
Hive的服务层(thriftserver):hive的可选组件,此组件是一个软件服务框架,允许客户端使用包括Java,C++等其它语言通过编程的方式远程访问Hive
Hive将元数据存储在数据库中,连接到这些数据库(mysql,derby)的模式分三种:单用户模式,多用户模式,远程服务器模式
元数据包括Database,表名,表的列及类型,存储空间,分区,表数据,所在目录等
Hive的解释器(驱动Driver):完成HQL的查询语句的词法分析,语法分析,编译,优化,以及查询计划的生成,生成的查询计划存储在HDFS中,并由MapReduce调用执行
Hive的元数据:Hive的元数据存储在数据库中,如mysql,derby,Hive中的元数据包括(表名,表所属的数据库名,表的拥有者,列/分区字段,表的类型(是否外部表),表的数据所在的目录)
Hive与关系型数据库的比较:
比较项 | 关系数据库 | Hive |
---|---|---|
ANSI SQL | 支持 | 不完全支持 |
更新 | Update,insert,delete | insert,override into table |
事务 | 支持 | 支持(部分支持) |
模式 | 写模式 | 读模式 |
存储位置 | 块设备,本地文件系统 | HDFS |
延时 | 低 | 高 |
多表插入 | 不支持 | 支持 |
子查询 | 完全支持 | 只能用在from子句中 |
视图 | updatable | read-only |
可扩展性 | 低 | 高 |
数据规模 | 小 | 大 |
实时响应 | 毫秒级 | 秒级 |
数据库基本操作:
1.规则语法:
1.1注释语法
-- 单行注释
// 单行注释
/*
* 多行注释
*/
1.2大小写规则:
1.Hive的数据库名,表名都不区分大小写
2.建议关键字大写
1.3命名规则:
1.名字不能使用数字开头
2.不能使用关键字
3.尽量不使用特殊符号
4.如果表比较多,那么表名和字段名可以定义规则加上前缀
Hive中的数据类型:
分类 | 类型 | 描述 | 字面量实例 |
---|---|---|---|
基本数据类型 | boolean | true/false | true |
TINYINT | 1字节的有符号整数(-128-127) | 1Y | |
SMALLINT | 2个字节的有符号整数 | 1S | |
INT | 4字节 | 1 | |
BIGINT | 8字节 | 1L | |
FLOAT | 4字节小数型 | 1.0 | |
DOUBLE | 8字节小数型 | 1.0 | |
重要 | STRING | 字符串 | “a” |
VARCHAR | 变长字符串 | “a” | |
CHAR | 固定长度字符串 | “a” | |
BINARY | 字节数组 | 无法表示 | |
DATE | 日期 | ‘2016-03-29’ | |
TIMESTAMP | 时间戳 | 122355126365655 |
//创建库
create database mydb;
create dababase if not exists zoo comment 'this is a database of qianfeng';
//切换数据库
use mydb;
//查看数据库信息
desc database mydb;
desc database extended mydb;//查看数据库的扩展信息
//删除数据库
drop database mydb;//这只能删除空库
drop database mydb cascade;//强制删除
创建库的本质:在hive的warehouse下面的目录下创建一个目录(库名.db命名的目录)
创建表的本质:在对应的库目录下创建一个以表名命名的目录
//创建表
create table t_user(id int,name string);
create table mydb.t_user(id int,name string);
create table if not exists t_user(
uname string comment 'this is name',
chinese int,
math int,
english int
)
comment 'this is my table'
row format delimited
fields terminated by '\t'
lines terminated by '\n'
stored as textfile