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;
posted @ 2020-12-02 18:18  Later^^  阅读(131)  评论(0编辑  收藏  举报