Hive的DDL(数据定义语言)操作
数据库的DDL
建库语法
CREATE DATABASE [IF NOT EXISTS] database_name [IF NOT EXISTS] --增强代码的健壮性
[COMMENT database_comment] --这个库是干嘛的
[LOCATION hdfs_path] --你当前的库存储的hdfs路径
[WITH DBPROPERTIES (property_name=property_value, ...)]; --一点用没有(鸡肋)
切换数据库
use 库名
use db_hive2;
增
create database db_hive
comment 'this in my first db'
with dbproperties('dbtype'='hive','owner'='haitun');
create database db_hive2
location '/db_hive2';
create database db_hive3
location '/dsadsadsasd';
create database if not exists db_hive2
location '/db_hive2';
--在你不指定的location的情况下 默认在你的hdfs/user/hive/warehouse下创建一个以database_name.db名的文件夹 来当做库
--在你指定location的情况下 拿最后一级目录当做库的名字
删
drop database 库名
drop database db_hive2;
drop database if exists db_hive2; --加上 if exists 增加代码的健壮性
drop database db_hive cascade; --强制删除 (当你库下面有表的时候) 慎用(只有你确定所有表都没用的时候)
改
用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
alter database db_hive set dbproperties('dbtype'='db'); --修改原来的属性
alter database db_hive set dbproperties('createtime'='2020-08-19'); --增加原来的属性
查
--展示所有的数据库
show databases;
--模糊展示
show databases like 'db_hive*'
--描述数据库 --不会展示 库的属性 dbproperties
desc database 库名
desc database db_hive;
--描述数据库详情 --会展示 库的属性 dbproperties parameters
desc database extended 库名;
desc database extended db_hive;
表的DDL
创建表的语法
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]
--字段分隔符
-- songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing_10010 字段分隔符是 ','
--有默认值 默认值是 ascii 码表 0001 ^A ctrl+v ctrl+a
[COLLECTION ITEMS TERMINATED BY char]
--集合(map array struct)分隔符
--bingbing_lili xiao song:18_xiaoxiao song:19 hui long guan_beijing_10010 分隔符是'_'
--有默认值 默认值是 ascii 码表 0010 ^B ctrl+v ctrl+b
[MAP KEYS TERMINATED BY char]
--map的kv分隔符
--xiao song:18 分隔符是 ':'
--有默认值 默认值是 ascii 码表 0100 ^C ctrl+v ctrl+c
[LINES TERMINATED BY char]
--行分隔符 默认值是 '\n'
]
[STORED AS file_format] --当前创建的表存储格式
[LOCATION hdfs_path] --当前表的hdf存储路径
[TBLPROPERTIES (property_name=property_value, ...)] --表的属性 这个用处比较大
[AS select_statement] --根据查询结果创建一张表 包括表的结构和数据
[LIKE table_name] --模仿一张表 只有表结构没有表的数据
增
创建内部表(管理表)
--1.直接创建
create table student(
deptno int,
deptname string
)
row format delimited fidlds terminated by '\t'; --记得指定分隔符
--2.通过查询结果创建(记得指定分隔符)
create table student2
row format delimited fields terminated by '\t'
as select * from student;
--3.不赋值数据,只复制结构和分隔符
create table student3 like student;
创建外部表
外部表的含义:hive不掌握着表的数据生命周期,当hive删除外部表的时候,不会删除hdfs上的数据,只会删除元数据
思考:如何通过sql删除外部表里的数据?
1.修改表的属性,把外部表转换成内部表就可以
注意:属性名和属性值要大写
alter table table_name set tblproperties('EXTERNAL'='FALSE');
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format dilimited fields terminated by '\t'
location '/company/dept' --外部表最好写上存储位置,因为数据有可能在建表前存在
外部表和内部表之间的转换
通过设置表的tblpropertites里的属性来实现
表是否为内部表还是外部表是由Table Parameters 里面的EXTERNAL属性来控制 包括TRUE和FALSE 都得大写
--内部表转换成外部表
alter table student4 set tblproperties('EXTERNAL'='TRUE');
--外部表转成内部表
alter table emp set tblproperties('EXTERNAL'='FALSE');
删
--1.删除内部表
drop table student;
--2.删除外部表
drop table student; --只能删除元数据,不能删除hdfs源数据
--3.清空表
以下命令只能清空内部表,无法清空外部表
truncate table student3 ;
改
--改表名 会连同你的hdfs文件夹名字一起改掉
alter table oldname rename to newname;
--更新列 注意改的列的数据类型,只能由小往大改
alter table stu2 change column 旧列名 新列名 数据类型;
alter table stu2 change column id id int;
alter table stu2 change column id ids bigint;
alter table stu2 change column id idss bigint;
--增加列
alter table table_name add columns(weight double,money bigint);
--替换列
ALTER TABLE table_name REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
-- 替换之减少列 如果你想替换时候较少列 那么你减少后剩余部分 应该和之前字段 满足类型的大小关系
alter table stu2 replace columns (id bigint , name string);
-- 替换之增加列 增加部分可以没有类型大小的关系 ,如果有对应的部分则满足类型大小的对应关系
alter table stu2 replace columns (id bigint , name string , height double, hair bigint);
查
--展示库下面的所有表
show tables;
--描述表
desc student;
--描述表的详情
desc formatted student;