1、数据库的DDL操作
(1)创建数据库
数据库在HDFS上的默认存储路径是/user/hive/warehouse/数据库名.db
- hive > create database db_hive;
- 两者等价
- hive > create database if not exists
(2)显示所有数据库
hive> show databases;
(3)查询数据库(模糊查询)
hive> show databases like 'db_hive*';
(4)查看数据库详情
- hive> desc database db_hive;
- 两者等价:
- hive> desc database extended db_hive;
(5)切换当前数据库
hive > use db_hive;
(6)删除数据库
- #删除为空的数据库
- hive> drop database db_hive;
- #如果删除的数据库不存在,最好采用if exists 判断数据库是否存在
- hive> drop database if exists db_hive;
- #如果数据库中有表存在,这里需要使用cascade强制删除数据库
- cascade;
2、表DDL操作
(1)建表语法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 分区
[CLUSTERED BY (col_name, col_name, ...) 分桶
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format] row format delimited fields terminated by “分隔符”
[STORED AS file_format]
[LOCATION hdfs_path]
create table:创建一个指定名字的表
EXTERNAL:创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),指定表的数据保存在哪里
COMMENT:为表和列添加注释
PARTITIONED BY :创建分区表
CLUSTERED BY :创建分桶表
SORTED BY: 按照字段排序(一般不常用)
ROW FORMAT :指定每一行中字段的分隔符:如row format delimited fields terminated by ‘\t’
STORED AS :指定存储文件类型,
- 常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、ORCFILE(列式存储格式文件)如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE
LOCATION 指定表在HDFS上的存储位置。
(2)创建内部表(3种)
直接建表:使用标准的建表语句;
如create table stu(id int, name string);
可以通过insert into向hive表当中插入数据,但是不建议工作当中这么做;因为每个insert语句转换成mr后会生成一个文件
如:insert into stu(id,name) values(1,"zhangsan");
查询建表法 :通过AS 查询语句完成建表:将子查询的结果存入新表里 ;
as select id, name from stu;
like建表法 :根据已经存在的表结构创建表
如:create table if not exists myhive.stu2 like stu;
(3)查询表的类型(若是外部表,则显示为EXTERNAL)
hive > desc formatted myhive.stu;
(4)创建外部表
- 外部表因为是指定其他的hdfs路径的数据加载到表当中来;
- 删除hive表的时候,数据仍然存放在hdfs当中,不会删掉 ,只是删除元数据信息;
- 创建外部表的时候需要加上external关键字 ;
(5)向表中加载数据
实际工作当中使用load的方式来加载数据到内部表或者外部表 ;
第一种:数据在linux本地磁盘
- load data local inpath '..本地linux路径..' into table tablename;
- 或者
- load data local inpath '..本地linux路径..' overwrite table tablename;
如:从本地文件系统加载数据到teacher表当中去:
load data local inpath '/install/hivedatas/teacher.csv' into
第二种:数据在hdfs上
- load data inpath '.hdfs路径..' into table tablename;
- 或者:
- load data inpath '.hdfs路径..' overwrite table tablename;
从hdfs上面加载文件到teacher表里面去 :
load data inpath '/hdfsload/hivedatas' overwrite into table myhive.teacher;
(6)内部表与外部表的互相转换(set tblproperties的值)
内部表转换为外部表
- #将stu内部表改为外部表
- alter table stu set tblproperties('EXTERNAL'='TRUE');
外部表转换为内部表
- #把teacher外部表改为内部表
- alter table teacher set tblproperties('EXTERNAL'='FALSE');
(7)内部表与外部表的区别
建表语法的区别 :
- 外部表在创建的时候需要加上external关键字 ;
删除表之后的区别 :
- 内部表删除后,表的元数据和真实数据都被删除了;
- 外部表删除后,仅仅只是把该表的元数据删除了,真实数据还在,后期还是可以恢复出来。
使用时机的区别:
- 仅仅个人使用,其他人不使用的时候就可以创建内部表,
- 大家都要要使用,就创建外部表 。
位置的不同:
- 外部表都是用在数据仓库的ODS层 ;
- 内部表都是用在数据仓库的DW层 。
(8)修改表的名称
alter table old_table_name rename to
(9)增加列
alter table stu4 add
(10)修改列
alter table stu4 change
(11)hive的分区表
在hive当中也是支持“分而治之”的思想,就是我们可以把大的数据,按照每天,或者每小时进行切分成一个个的小的文件,这样去操作小的文件就会容易得多了 。即把数据按特定的形式分目录存储在不同的文件夹下。
在文件系统上建立文件夹,把表的数据放在不同文件夹下面,加快查询速度。
- 创建分区表语法
partitioned by (month string)
2.创建一个表带多个分区 (分年、月、日三个区)
partitioned by (year string, month string, day
3.加载数据到分区表当中去
hive (myhive)>load data local inpath '/install/hivedatas/score.csv' into table score partition (month='201806');
4.加载数据到多分区表当中去
hive (myhive)> load data local inpath '/kkb/install/hivedatas/score.csv' into table score2 partition(year='2018', month='06', day='01');
5.查看分区
hive (myhive)> show partitions score;
6.添加一个分区
add partition(month='201805');
7.同时添加多个分区
add partition(month='201804') partition(month = '201803');
8.删除分区
drop partition(month = '201806');