学习hive
1.hive是一个可以将sql翻译为mr程序的工具,支持用户将hdfs上的文件映射为表结构,进行查询
2.HIVE将用户定义的库、表结构等信息存储hive的元数据库
3.hive的查询方式
第一中:交互式查询
hive>select * from t_1;
第二种:将hive作为命令一次性运行
hive -e "use default;create table tset_1(id int,name string); "
将sql写入一个文件比如q.hql,然后用hive命令执行,
hive -f q.hql
第三种:将方式二写入一个xxx.sh脚本中
4.建表:
4.1:表定义信息会被记录到hive的元数据(mysql的hive库)
4.2:会在hdfs上的hive库目录中创建一个跟表名一致的文件夹
4.3:查看表的结构
hive> desc test_1;
4.4:编辑文本
vi test_1.txt
1,zhang,12
2,xailjsn,50
4.5.上传文件到hdfs并查看
hadoop fs -put test_1.txt /user/hive/warehouse/test_1
hive> select * from test_1;
结果和预想的不一样,这是因为建表语句是:create table test_1(id string,name string,age int);并没有指定分隔符”,”
4.6.删除表
hive> drop table test_1;
4.7.重新编辑文件
create table test_1(id string,name string,age int)
row format delimited
fields terminated by ‘,’;
上传文件,和我们想要的结果一样
5.内部表与外部表
5.1外部表: create external table t_3(id int,name string,salary bigint,add string)
row format delimited
fields terminated by ‘,’
location ‘/aa/bb’;
其中externa为关键字
5.2内部表: create table t_2(id int,name string,salary bigint,add string)
row format delimited
fields terminated by ‘,’
location ‘/aa/bb’;
load data local inpath ‘/home/salary.txt’ into table t_2;
将table_2加载到salary.txt中
5.3区别:
内部表的目录由hive创建在默认的仓库目录下:/user/hive/warehouse/…
外部表的目录由用户建表时自己指定: location ‘/位置/’
drop一个内部表时,表的元信息和表数据目录都会被删除;
drop一个外部表时,只删除表的元信息,表的数据目录不会删除;
5.4意义:
通常,一个数据仓库系统,数据总有一个源头,而源头一般是别的应用系统产生的,
其目录无定法,为了方便映射,就可以在hive中用外部表进行映射;并且,就算在hive中把
这个表给drop掉,也不会删除数据目录,也就不会影响到别的应用系统
6.分区关键字 PARTITIONED BY
hive> create table test_4(ip string,url string,staylong int)
partitioned by (day string)
row format delimited
fields terminated by ‘,’;
注意分区的day不能存在于表字段中
6.1:准备数据
[root@hdp01 home]# vi pv.data.2019-05-10
192.168.9.10,www.a.com,1000
192.168.10.10,www.b.com,100
192.168.11.10,www.c.com,900
192.168.12.10,www.d.com,100
192.168.13.10,www.e.com,2000
6.2:导入数据到不同的分区目录:
hive> load data local inpath ‘/home/pv.data.2019-05-10’ into table test_4 partition(day=‘2019-05-10’);
查看192.168.72.110:50070的 /user/hive/warehouse/test_4
可以看到有一个day=2019-05-10的文件夹,说明分区成功
6.3:准备数据
[root@hdp01 home]# vi pv.data.2019-05-11
192.168.9.11,www.f.com,100
192.168.10.12,www.g.com,10
192.168.11.13,www.h.com,90
192.168.12.14,www.i.com,10
192.168.13.15,www.g.com,200
6.4:导入数据到不同的分区目录:
hive> load data local inpath ‘/home/pv.data.2019-05-11’ into table test_4 partition(day=‘2019-05-11’);
6.5:查询:
hive> select * from test_4;
6.6:可以分区查:
hive> select * from test_4 where day=“2019-05-11”;
6.7:查看2019-05-11这天的访问人数:
select distinct ip from test_4 where day=“2019-05-11”;
7.导入数据
7.1:将hive运行所在机器的本地磁盘上的文件导入表中:
hive> load data local inpath ‘/home/pv.data.2019-05-11’ overwrite into table test_4 partition(day=”2019-05-12”);
7.2:将hdfs中的文件导入表中:
hive> load data inpath ‘/user.data.2’ into table t_1;
注:不加local关键字,则是从hdfs的路径中移动文件到表目录中;
7.3:从别的表查询数据后插入到一张新建表中:
hive> create table t_1_jz
as
select id,name from test_1;
7.4:从别的表查询数据后插入到一张已存在的表中
加入已存在一张表:可以先建好:
hive> create table t_1_hd like test_1;
从test_1中查询一些数据出来插入到t_1_hd中:
hive>insert into table t_1_hd
select
id,name,age
from test_1
where name=‘ZDP’;
7.5:查找名字带有L的:
insert into table t_1_hd
select
id,name,age
from test_1
where name like’%L’;
7.6:关于分区数据导入另外一张表建表
hive> create table t_4_hd like test_4;
hive> insert into table t_4_hd partition(day=‘2019-04-10’) select ip,url,staylong from test_4 where day=‘2019-05-10’;
8. 导出数据
8.1将数据从hive的表中导出到hdfs的目录中
hive> insert overwrite directory ‘/aa/test_1’
select * from test_1 where name=‘lis’;
注:即使hdfs中没有/aa/bb/目录,也会自动生成
hive> insert overwrite local directory ‘/aa/test_1_2’
row format delimited
fields terminated by ‘,’
select * from test_1 limit 100
hive -e “select * from test_1” | tr “\t” “,” > result.csv
下载到windows下是这样的:
8.2:将数据从hive的表中导出到本地磁盘目录中:
hive> insert overwrite local directory ‘/aa/bb’
select * from test_1 ;
9. HIVE的存储文件格式
9.1:HIVE支持很多种文件格式: SEQUENCE FILE | TEXT FILE | PARQUET FILE | RC FILE
默认为TXT格式,SEQUENCE FILE为链式
9.2:试验:先创建一张表t_seq,指定文件格式为sequencefile
hive> create table t_seq(id int,name string)
stored as sequencefile;
9.3:然后,往表t_seq中插入数据,hive就会生成sequence文件插入表目录中
hive> insert into table t_seq
select * from test_1 ;
10 修改表的分区:
10.1:查看表的分区 show partitions 表名;
hive> show partitions test_4;
10.2:添加分区
hive> alter table test_4 add partition(day=‘2019-05-12’) partition(day=‘2017-04-13’);
10.3:添加完成后,可以检查t_4的分区情况:
hive> show partitions test_4;
10.4:然后,可以向新增的分区中导入数据:
–可以使用load
hive> load data local inpath ‘/root/pv.data.2019-05-12’ into table test_4 partition(day=‘2019-05-12’);
hive> select * from test_4 where day=‘2019-05-12’;
–还可以使用insert
insert into table test_4 partition(day=‘2019-05-16’) select * from test_4 where staylong>80 and partition(day=‘2019-05-11’);
Hive> insert into table test_4 partition(day=‘2019-05-13’)
select ip,url,staylong from test_4 where day=‘2019-05-11’ and staylong>20;
hive> select * from test_4 where day=‘2019-05-13’;
10.5: 删除分区
hive> alter table test_4 drop partition (day=‘2019-05-13’);
hive> select * from test_4;
11.修改表的列定义
11.1:查看t_seq表的定义
hive> desc t_seq;
11.2:添加列:
hive> alter table t_seq add columns(address string,age int);
11.3:查看t_seq表的定义
hive> desc t_seq;
11.4:全部替换:
hive> alter table t_seq replace columns(id int,name string,address string,age int);
11.5:修改已存在的列定义:
hive> alter table t_seq change id uid string;
12. 显示命令
hive> show tables
hive> show databases