目录
一、DDL(Data Definition Language 数据库定义语言)
一、DDL(Data Definition Language 数据库定义语言)
1.创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name --[IF NOT EXISTS] 增强代码的健壮性
[COMMENT database_comment] --库的注释
[LOCATION hdfs_path] -- 指定对应的hdfs路径
[WITH DBPROPERTIES (property_name=property_value, ...)]; --库的属性
创建库
//数据库在HDFS上的默认存储路径是/user/hive/warehouse/*.db
hive (default)> create database db_hive;
hive (default)> create database if not exists db_hive; //标准写法
hive (default)> create database db_hive2 location '/db_hive2';//指定在hdfs上存放的位置
2.查询数据库
hive> show databases; //查询数据库
hive> show databases like 'db_hive*'; //查询指定要求的数据库
hive> desc database db_hive; //显示数据库信息
hive> desc database extended db_hive; //显示数据库详细信息
hive (default)> use db_hive; //切换数据库
3.修改数据库
只可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
hive (default)> alter database db_hive set dbproperties('createtime'='20170830');
//设置某些键值对属性
4.删除数据库
hive>drop database db_hive2; //删除空数据库
hive> drop database if exists db_hive2; //标准写法
hive> drop database db_hive cascade; //强制删除数据库
5.创建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name --external 如果不加创建表为内部表
--加上以后创建表为外部表
[(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 DELIMITED] --表的数据对应格式
[FIELDS TERMINATED BY char] --字段分隔符 ascii 1号位 ^A ctrl+v ctrl+a
[COLLECTION ITEMS TERMINATED BY char] --集合分隔符 ascii 2号位 ^B ctrl+v ctrl+b
[MAP KEYS TERMINATED BY char] --map的kv分隔符 ascii 3号位 ^C ctrl+v ctrl+c
[LINES TERMINATED BY char] ] --行分隔符 默认值'\n'
以上的默认值非常不好用
[STORED AS file_format] --表对应的数据存储的格式 TEXTFILE .txt orc
[LOCATION hdfs_path] --表所对应hdfs路径
[TBLPROPERTIES (property_name=property_value, ...)] --表对应的属性 非常有用的
[AS select_statement] --根据查询结果来创建一张表 带表的所有结构和数据 唯独不带分隔符
[LIKE table_name] --模仿一张表 带表的结构不带数据 但是带分隔符
管理表(内部表)
简介:默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。 当删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
create table if not exists student(
id int, name string
)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/student'; //普通创建表
create table if not exists student as select id, name from student;//根据查询结果创建表
create table if not exists student3 like student; //根据已经存在的表结构创建表
desc formatted student2; //查看表的详细信息
drop table student2; //删除表
外部表
简介:因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t'
location '/company/dept'; //创建一个外部表
两个表的相互转换
alter table student set tblproperties('EXTERNAL'='TRUE'); //修改内部表student为外部表
alter table student set tblproperties('EXTERNAL'='FALSE'); //修改外部表student为内部表
注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写
修改表
ALTER TABLE table_name RENAME TO new_table_name //重命名
alter table dept add columns(deptdesc string); //在dept表中增加列
alter table dept change column deptdesc desc string; //更新列
alter table dept replace columns(deptno string, dname
string, loc string); //替换列
删除表
drop table dept;
清除表
truncate table student; //Truncate只能删除管理表,不能删除外部表中数据
二、DML数据操作
1.数据导入
向表中装载数据(Load)
load data [local] inpath '数据的path' [overwrite] into table student [partition (partcol1=val1,…)];
(1)load data:表示加载数据
(2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
(3)inpath:表示加载数据的路径
(4)overwrite:表示覆盖表中已有数据,否则表示追加
(5)into table:表示加载到哪张表
(6)student:表示具体的表
(7)partition:表示上传到指定分区
实例
create table student(id int, name string) row format delimited fields terminated by '\t';//创建一张表
load data local inpath '/opt/module/hive/datas/student.txt' into table student;//加载本地文件到hive
dfs -put /opt/module/hive/datas/student.txt /user/student.txt //上传文件到HDFS
load data inpath '/user/student.txt' into table student; //加载HDFS的文件到Hive,上传后文件消失
load data inpath '/user/student.txt' overwrite into table student; //加载数据覆盖表中已有的数据
通过查询语句向表中插入数据(Insert)
insert into table student values(1,'ll'),(2,'ss'); //基本模式插入数据
insert overwrite table student select id, name from student where id < 5;
//insert into:以追加数据的方式插入到表或分区,原有数据不会删除
//insert overwrite:会覆盖表中已存在的数据
//insert不支持插入部分字段,并且后边跟select语句时,要跟as select区分开
查询语句中创建表并加载数据(As Select)
create table if not exists student3 as select id, name from student; //根据查询的结果创建表
创建表时通过Location指定加载数据路径
create external table if not exists student(
id int, name string
)
row format delimited fields terminated by '\t'
location '/student';
Import数据到指定Hive表中
import table student from '/user/hive/warehouse/export/student';
//先用export导出后,再将数据导入。并且因为export导出的数据里面包含了元数据,因此import要导入的表不可以存在,否则报错。
2.数据导出
//将查询的结果导出到本地
insert overwrite local directory '/opt/module/hive/datas/export/student'
select * from student;
//将查询的结果格式化导出到本地
insert overwrite local directory '/opt/module/hive/datas/export/student'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select * from student;
//将查询的结果导出到HDFS上(没有local)
insert overwrite directory '/user/student'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select * from student;
注意:由于是overwrite,所以导出路径一定要写具体
Hadoop命令导出到本地
dfs -get /user/hive/warehouse/student/student.txt
/opt/module/hive/datas/export/student.txt;
Hive Shell 命令导出
hive -e 'select * from default.student;' > /opt/module/hive/datas/export/student4.txt;
Export导出到HDFS上
export table default.student to '/user/hive/warehouse/export/student';
//export和import主要用于两个Hadoop平台集群之间Hive表迁移,不能直接导出的本地