数据库DDL操作
1.创建数据库
hive > create database db_hive; # 或者 hive > create database if not exists db_hive;
数据库在HDFS上的默认存储路径是/usr/hive/warehouse/数据库名.db
- 显示所有数据库
hive > show databases;
- 查询数据库
hive > show databases like 'db_hive*';
- 查询数据库详情
hive > desc database db_hive; #或者 hive > desc database extended db_hive;
- 切换当前数据库
hive > use db_hive;
- 删除数据库
#删除空数据库 hive > drop database db_hive; #如果删除数据库不存在,最好采用 if exists 判断数据库是否存在 hive > drop database if exists db_hive; #如果数据库中有表存在,这里需要使用cascade强制删除数据库 hive > drop database if exists db_hive cascade;
表DDL操作
- 创建表语法
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]
- 字段解释说明
- 常用的存储文件类型:sequencefile、textfile、orcfile
- 如果文件数据是纯文本,可以使用stored as textfile。如果数据需要压缩,使用stored as sequencefile
- row format delimited fields terminated by '\t'
- create table 创建一个指定名字的表
- external 创建一个外部表,在建表的同时指定一个指向实际数据的路径(location),指定表的数据保存在哪里
- comment 为表和列添加注释
- partitioned by 创建分区表
- clustered by 创建分桶表
- sorted by 按照字段排序(一般不常用)
- row format 指定每一行中字段的分隔符
- stored as 指定存储文件类型
- location 指定表在HDFS上的存储位置
- 创建内部表
- 使用标准建表语句创建
use myhive; create table stu(id int,name string); insert into stu(id,name) values(1,"zhangsan"); #查询 select * from stu;
- 子查询语句建表
create table if not exists myhive.stu1 as select id,name from stu; #查询 select * from stu1;
- 根据已经存在的表结构创建表
create table if not exists myhive2.stu2 like stu; #查询 select * from stu2; * hql标准语句创建表 ```shell use myhive; create table if not exists stu3( id int, name string )row format delimited fields terminated by '\t' stored as textfile location '/user/stu3'
- 创建外部表
外部表特点:指定其他的hdfs路径的数据加载到表当中,所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据任然存在hdfs当中,不会删除
HQL建表语句中要加上external关键字,location字段可以指定,也可以不指定
create external table myhive.teacher(t_id string,t_name string) row format delimited fields terminated by '\t';
- 内部表和外部表的互相转换
#内部表转换为外部表 alter table stu set tblproperties('EXTERNAL'='TRUE'); #外部表转换为内部表 alter table teacher set tblproperties('EXTERNAL'='TRUE');
内部表和外部表的区别
- 创建语句的区别
外部表在创建的时候需要加上external关键字 - 删除表之后的区别
内部表删除后,表的元数据和真实数据都被删除了
外部表删除后,仅仅只是把该表的元数据删除了,真实数据还在,后期还是可以恢复出来
内部表和外部表的使用时机
- 内部表由于删除表时会同步删除HDFS的数据文件,所以确定如果一个表仅删除是你独占使用,其他人不使用的时候就可以创建内部表,如果一个表的文件数据,其他人也要使用,那么就创建外部表
- 一般外部表都是用在数据仓库的ODS层
- 内部表都是用在数据仓库的DW层