DDL数据定义语言

1、创建数据库

创建数据库的语句

CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];

注意:创建的hive库默认是存放在hdfs上的,默认存放位置是/user/hive/warehouse/*.db

①创建一个数据库

create database data;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive 创建数据库 报错名称和描述

②如果已经存在数据库,则会报错

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive_02

为了避免出现这种问题,可以在建库时候使用if not exists

create database if not exists data;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive 创建数据库 报错名称和描述_03

③创建的hive库默认是存放在hdfs上的,默认存放位置是/user/hive/warehouse/*.db,如果想要存放位置改变,在创建表的时候也可以指定

create database data2 location '/data2.db';

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_04

2、查询数据库

①显示数据库

show databases;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_05

②查看数据库详情

1)显示数据库信息

desc database data;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_06

2)显示数据库详细信息,extended

desc database extended data;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive 创建数据库 报错名称和描述_07

3)在创建数据库的时候还可以加上创建时间属性

create database data3 with dbproperties(“createtime”=”20211222”);

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive_08

4)再次查询数据库详情,就会显示创建时间

desc database extended data3;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_数据库_09

③切换当前数据库

use data2;

3、修改数据库

可以使用ALTER DATABASE命令为某个数据库属性进行设置

alter database data3 set dbprperties('createtime'='2021-12-22');

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_10

查看是否修改成功

desc database extended data3;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_11

4、删除数据库

①删除空数据库

drop database data2;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_数据库_12

②如果数据库不存在,则会报错

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_13

所以在删除之前我们可以使用if exists判断以下

drop database if exists data2;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_14

③如果删除的数据库不为空,使用drop就会报错

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hadoop_15

所以如果删除不为空的数据库,可以使用cascade

drop database data cascade;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_数据库_16

5、创建表

建表语句

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] 
[STORED AS file_format] 
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]
[LIKES existing_table_or_view_name]

字段说明

CREATE TABLE

创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常

EXTERNAL

1) 关键字可以让用户创建一个外部表 在建表的同时可以指定一个指向实际数据的路径(LOCATION) 2) 在删除表的时候 内部表的元数据和数据会被一起删除, 外部表只删除元数据,不删除数据。

COMMENT

为表和列添加注释。

PARTITIONED BY

创建分区表

CLUSTERED BY

创建分桶表

SORTED BY

不常用,对桶中的一个或多个列另外排序

ROW FROMAT

见下表

STORE AS

指定存储文件类型 常用的文件存储类型: SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件) 如:store as textfile、store as sequencefile

LOCATION

指定表在HDFS上的存储位置

AS

后跟查询语句,根据查询语句结果创建表

ROW FROMAT字段说明

字段

说明

Fields

指定字段之间的分隔符

Collection

用于指定集合中元素间的分隔符

Map

用于指定map集合中键值对间的分隔符

Lines

用于指定每行记录间的分隔符

SerDe

是Serialize/Deserialize的简称 用户在建表时可以自定义SerDe或使用自带的SerDe

若未指定Row Format,则用自带的SerDe

①内部表(管理表)

管理表,又称内部表,如果没有指定表的类型,默认创建的表就是内部表,当我们删除一个内部表时,其表的数据也会被删除。Hive默认会将这些表的数据存储在hive.metastore.warehouse.dir定义目录的子目录下。由于在删除的时候也会把数据删除掉,所以内部表不适合和其他工具共享数据

1)创建内部表

create table if not exists student(
    id int,
    name string
)
row format delimited
fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/student';

建表语句说明

语句

说明

fields terminated by ‘\t’

字段之间采用’\t’分割

stored as textfile

文件类型为textfile

location ‘/user/hive/warehouse/student’

在hdfs上的位置

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive 创建数据库 报错名称和描述_17

2)创建数据文件student.txt

vim /opt/module/hive/datas/student.txt
1001	student1
1002	student2
1003	student3
1004	student4
1005	student5
1006	student6
1007	student7
1008	student8
1009	student9

3)上传数据

dfs -put /opt/module/hive/datas/student.txt /user/hive/warehouse/student;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive 创建数据库 报错名称和描述_18

4)查看数据是否上传

hive 创建数据库 报错名称和描述 hive 创建数据库语句_数据库_19

5)查询表的类型

desc formatted student;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_数据库_20

6)根据查询结果创建表

create table if not exists student2 as select id, name from student;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive_21

7)根据已经存在的表结构创建表

create table if not exists student3 like student;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_22

8)查询表的类型

desc formatted student2;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive 创建数据库 报错名称和描述_23

9)删除student,会发现hdfs上的数据也不存在了

drop table student;

总结:hive表中导入数据的两种方式:

1、使用load将文件数据导入表中,要求文件要按照hive表的规则进行编写

load data local inpath '/opt/module/hive/datas/personInfo.txt' into table personinfo;

2、指定了hive表的hdfs路径,将文件传到相应的路径下,要求文件要那招hive表的规则进行编写

dfs -put /opt/module/hive/datas/student.txt /user/hive/warehouse/student;

②外部表

因为表是外部表,所以Hive并非认为其完全拥有这份数据。

删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。

在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。外部表多用于存储原始数据,为多个部门、小组所使用,采用外部表共易共享数据。

1)在/opt/module/hive/datas目录下编辑文件dept.txt,添加如下内容

vim /opt/module/hive/datas/dept.txt
10	ACCOUNTING	1700
20	RESEARCH	1800
30	SALES	1900
40	OPERATIONS	1700

2)在/opt/module/hive/datas目录下编辑文件emp.txt,添加如下内容

vim /opt/module/hive/datas/emp.txt
7369	SMITH	CLERK	7902	1980-12-17	800.00		20
7499	ALLEN	SALESMAN	7698	1981-2-20	1600.00	300.00	30
7521	WARD	SALESMAN	7698	1981-2-22	1250.00	500.00	30
7566	JONES	MANAGER	7839	1981-4-2	2975.00		20
7654	MARTIN	SALESMAN	7698	1981-9-28	1250.00	1400.00	30
7698	BLAKE	MANAGER	7839	1981-5-1	2850.00		30
7782	CLARK	MANAGER	7839	1981-6-9	2450.00		10
7788	SCOTT	ANALYST	7566	1987-4-19	3000.00		20
7839	KING	PRESIDENT		1981-11-17	5000.00		10
7844	TURNER	SALESMAN	7698	1981-9-8	1500.00	0.00	30
7876	ADAMS	CLERK	7788	1987-5-23	1100.00		20
7900	JAMES	CLERK	7698	1981-12-3	950.00		30
7902	FORD	ANALYST	7566	1981-12-3	3000.00		20
7934	MILLER	CLERK	7782	1982-1-23	1300.00		10

3)上传数据到HDFS

dfs -mkdir /user/hive/warehouse/dept;
dfs -mkdir /user/hive/warehouse/emp;
dfs -put /opt/module/hive/datas/dept.txt /user/hive/warehouse/dept;
dfs -put /opt/module/hive/datas/emp.txt /user/hive/warehouse/emp;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_数据库_24

4)创建部门表的外部表

create external table if not exists dept(
    deptno int,
    dname string,
    loc int
)
row format delimited
fields terminated by '\t';

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive_25

5)创建员工表的外部表

create external table if not exists emp(
    empno int,
    ename string,
    job string,
    mgr int,
    hiredate string, 
    sal double, 
    comm double,
    deptno int)
row format delimited 
fields terminated by '\t';

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hadoop_26

6)查看数据

select * from dept;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_27

7)查看表结构

desc formatted dept;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hadoop_28

8)删除表,只是删除了metadata信息,在hdfs上的数据还是存在的

drop table dept;

③内部表和外部表的相互转换

1)查询表的类型

desc formatted student2;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_29

2)转换为外部表

alter table student2 set tblproperties('EXTERNAL'='TRUE');

hive 创建数据库 报错名称和描述 hive 创建数据库语句_数据库_30

3)再次查看表的信息

hive 创建数据库 报错名称和描述 hive 创建数据库语句_数据库_31

4)外部表转换为内部表

alter table student2 set tblproperties('EXTERNAL'='FALSE');

hive 创建数据库 报错名称和描述 hive 创建数据库语句_数据库_32

5)再次查看表信息

hive 创建数据库 报错名称和描述 hive 创建数据库语句_数据库_33

注意:(‘EXTERNAL’=‘TRUE’)和(‘EXTERNAL’=‘FALSE’)为固定写法,区分大小写!

6、表的修改

①重命名表

ALTER TABLE table_name RENAME TO new_table_name;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hadoop_34

②增加/修改/替换列信息

1)更新列

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name];

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive_35

更改字段的类型

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hadoop_36

2)增加和替换列

ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...) ;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive 创建数据库 报错名称和描述_37

3)想要指定某个字段的位置

①指定某个字段在最前面

alter table student name name string first;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_外部表_38

②将字段移动到指定字段的后面

alter table student change name name string after ename;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hadoop_39

③替换列

alter table student replace columns(id int);

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hadoop_40

7、删除表

drop table tableNmae;

hive 创建数据库 报错名称和描述 hive 创建数据库语句_hive 创建数据库 报错名称和描述_41