1.Hive基础部分:
1.1 hive内部表外部表区别
内部表:内部表会将表的数据一起剪切或者复制到对应的数据仓库(一般是/user/hive/warehouse)目录下去,所以在删除时候会将表的数据和结构一并删除
外部表:只记录表数据的位置信息,并不会复制或者剪切数据到对应的数据仓库目录中,删除外部表只会删除一些位置信息,并不删除原来表的数据
//创建内部表:
create table if not exists dept(
deptno int,
deptname string,
address string
)
row format delimited fields terminated by '\t';
//加载HDFS文件到Hive表中
load data inpath '/input/dept.txt' into table dept;
//用来指定原文件的列分隔符
row format delimited fields terminated by '\t';
load 如果操作的HDFS上的文件,代表着会移动或者剪切文件
desc formatted dept; //描述表结构信息
Location: hdfs://bigdata/user/hive/warehouse/db01.db/dept
Table Type: MANAGED_TABLE
//创建外部表:
create external table emp(
empno int,
empname string,
empjob string,
mgno int,
birthday string,
salary float,
bonus float,
depno int
)
row format delimited fields terminated by '\t'
location '/input/demo';
//描述表结构
desc formatted emp;
Location: hdfs://bigdata/input/demo
Table Type: EXTERNAL_TABLE
删除内部表
drop table dept;
删除外部表
drop table emp;
清空表数据
truncate table student;
1.2 hive分区和分桶
分区:所谓的分区就是将数据表产生多个文件夹再存入数据仓库中
分桶:会将被分桶的数据放入不同的文件下进行保存,每一个文件相当于一个桶(插入数据智能通过insert,每次插入都会产生一次mr)
==============创建分区表=====================
create table emp_part( //只是创建外部分区表的话就在 table前面加external
empno int,
empname string
)
partitioned by (province string)
row format delimited fields terminated by '\t';
//向分区表加载数据
load data local inpath '/home/user01/emp.txt' into table emp_part partition (province='CHICAGO');
//描述表信息
desc formatted emp_part;
//查询全表数据
select * from emp_part;
//查询分区字段表数据
select * from emp_part where province='CHICAGO';
//查看分区信息
show partitions emp_part;
//增加分区
aler table emp_part add [if not exist] partition(provine='zhejiang',city='hangzhou')
//删除分区
aler table emp_part drop [if exist] partition(provine='zhejiang',city='hangzhou')
==============创建桶表=====================
create table test_bucket_table(
id int,
name string
)
clustered by (id) into 5 bucket;
1.3 数据的导入导出
1.本地导入
laod data local inpth '本地文件(linux)' into table table_name;
laod data [local] inpth '文件' overwrite into table;(会覆盖原来的数据)
2.Hdfs导入
laod data inpth 'HDFS文件' [overwrite] into table table_name;
desc formatted table_name; --找到table_name在HDFS上的目录
3.创建表同时查询导入
create table tableB row format delimited filelds termianted by ',' as select * from tableA;
4.查询导入
insert into table table_namea select * fom tableB
//============数据导出=============
1.insert overwrite ... 导出到本地目录
insert overwrite local directory '/home/user01/export' row format delimited fields terminated by ' ' select * from emp_part1;
2.insert overwrite ... 导出到HDFS之上
insert overwrite directory '/export' select * from emp_part1 where day='20170308';
3.hive -e 'HQL query' >> test
bin/hive -e 'select * from db01.student' >> test.txt
4)sqoop
1.4 Hive中的排序方法
1.order by 全局排序
order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间。
2.sort by 局部排序 在reduce之前
sort by不是全局排序,其在数据进入reducer前完成排序,因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只会保证每个reducer的输出有序,并不保证全局有序。sort by不同于order by,它不受Hive.mapred.mode属性的影响,sort by的数据只能保证在同一个reduce中的数据可以按指定字段排序。使用sort by你可以指定执行的reduce个数(通过set mapred.reduce.tasks=n来指定),对输出的数据再执行归并排序,即可得到全部结果。
3.distribute by 分区排序(将map端数据分区分发给Reduce端)
distribute by是控制在map端如何拆分数据给reduce端的。hive会根据distribute by后面列,对应reduce的个数进行分发,默认是采用hash算法。sort by为每个reduce产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个reducer,这通常是为了进行后续的聚集操作。distribute by刚好可以做这件事。因此,distribute by经常和sort by配合使用。
4.cluster by 具备 cluster by 和 .sort by的功能
cluster by除了具有distribute by的功能外还兼具sort by的功能。当distribute by和sort by 是同一个字段的时候可以使用cluster by替代。但是排序只能是倒叙排序,不能指定排序规则为ASC或者DESC。
1.5 Hive数据仓库和数据库的区别
(1)由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,
再无类似之处。
(2)数据存储位置。 hdfs raw local fs
(3)数据格式。 分隔符
(4)数据更新。hive读多写少。Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
INSERT INTO … VALUES添加数据,使用UPDATE … SET修改数据 不支持的
HDFS 一次写入多次读取
(5) 执行。hive通过MapReduce来实现的 而数据库通常有自己的执行引擎。
(6)执行延迟。由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致Hive执行延迟高的因素是MapReduce框架
(7)可扩展性。
(8)数据规模。