hive是什么?
一个关系数据库,一个建立在hadoop之上的数据仓库架构,他们提供了一种类似sql的语句Hive Sql 简称hql,hive会将我们写的hql解析为hadoop支持的map reduce程序并将这个map reduce交给hadoop集群来处理。
hive的存储是建立在hadoop文件系统之上的,简单的说hive中的一个表就是我们设置的数据仓库的一个文件夹,你导入的数据就是这个文件夹下的文件,表的一个分区对应表下的一个目录。
hive的架构
表,外部表,分区,桶
hive本身没有专门的数据存储格式。hive 主要包含4种数据类型 表,外部表,分区,桶。
表:可以简单的理解为一个文件夹,表的结构存储在元数据中,表的数据存储在文件中。
外部表:表的数据不在hdfs系统中而在外部。
表和外部表的区别
1:创建的语句不同,外部表要加入关键字external和location
2 : 内部表是创建在你设置的数据仓库中,外部表是创建在其他文件夹,如果没有指定location他会创建在数据仓库的一个子文件夹中
3: 在导入数据到外部表时数据没有移动到数据仓库的目录下。
4:在删除表是会删除表的元数据和表的数据,但是外部表只会删除完数据,数据并不会被删除。
分区:分区重形式上可以理解为文件夹,想想在一个网站如果每天都有几百万条log日志。利用分区,我们可以把每天的日志放在一个文件夹下。
在创建表时加入分区
create table bucketed_user(id int,name string) clustered by (id) sorted by(name) into 4 buckets row format delimited fields terminated by ',' stored as textfile partitioned by (eid int)
根据分区导入数据
load data local inpath '/opt/hive-2.1.1/sample.txt' overwrite into table usersl partition (eid='1201')
这样在数据库所在的文件夹中将加入一个文件夹名字为eid=’1201’,数据在这个文件夹下。
桶
桶是比表和区颗粒度更小的,每个桶对应一个文件,根据某一列进行hash运算,对应hash值为0的写入00000_0对应hash值为1的写入00001_0分成几个桶就有几个文件
如果你把文件放再一个表中查询时将进行全局扫描,有了桶的出现可以对数据进行抽样检查。
创建带桶的table
create table bucketed_user(id int,name string) clustered by (id) sorted by(name) into 4 buckets row format delimited fields terminated by ',' stored as textfile
向桶中插入数据
insert overwrite table bucketed_user select * from users;
这样在bucketed_user这个文件夹下将多出几个文件。
bucketed_user中的数据
hive常用命令
show databases 查看所有数据库
use 数据库名 (默认在default数据库下) 切换数据库
show tables 查看所有的表
describe 表名 查看表的结构
truncate table 表名 删除表中的所有数据
create database 数据库名 创建数据库
DROP SCHEMA 数据库名 删除数据库
.创建table
create table if not exists usersl(eid int,name String,salary String,destignation String)
COMMENT 'User details' ROW FORMAT DELIMITED --下面这个是注释
FIELDS TERMINATED BY '\t' --字段终止符
LINES TERMINATED BY '\n' --行终止符
STORED AS TEXTFILE --文本保存的格式
插入数据
insert没有用。可以用load命令或者sqoop导入数据
导入语句
在本地导入
load data local inpath '/hive/warehouse/sample.txt' overwrite into table usersl
在hdfs导入
load data inpath 'hdfs://localhost:9000/hive/warehouse/sample.txt' overwrite into table usersl
DROP TABLE IF EXISTS 表名 删除表