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)数据规模。