Hive的DDL操作
Hive是一种数据库技术,可以定义数据库和表来分析结构化数据。主题结构化数据分析是以表方式存储数据,并通过查询来分析。
数据库定义语言DDL
主要是对库和表进行各种操作,具体包含:
库
- 创建库
- 查看库
- 删除库
- 切换库
表
- 创建表
- 查看表
- 修改表
- 删除表
- 清空表
库操作
一、创建库create database
在Hive中,数据库是一个命名空间或表的集合。创建了数据库之后,在HDFS上的存储路径默认为/usr/hive/warehouse/*.db
具体语法为:
1 | hive> create database|schema [if not exists] database_name # 1创建数据库 |
if not exists
是可选的,如果数据库存在则会报错;- 可以对数据库进行描述和添加属性
- 指定数据库的存放路径。默认地址是
/user/hive/warehouse/db_name.db/table_name/partition_name/…
1 | 0: jdbc:hive2://localhost:10000/default> create database if not exists worker comment 'learning hive'; # 创建worker数据库,并且戴上了注释 |
二、查询库信息
desc database databasename
三、创建带属性的库
创建一个带上注释和属性的test表
1 | 0: jdbc:hive2://localhost:10000/default> create database if not exists test comment 'test database' with dbproperties('creator'='peter','date'='2019-11-21'); |
四、查看库
- 查看有哪些库
1 | 0: jdbc:hive2://localhost:10000/default> show databases; |
-
查看某个库的具体属性信息
desc database databasename;
1 | 0: jdbc:hive2://localhost:10000/default> desc database test; |
- 查看正在使用的库
select current_database();
1 | 0: jdbc:hive2://localhost:10000/default> select current_database(); |
- 查看创建库的具体hive SQL语句
show create database databasename;
1 | 0: jdbc:hive2://localhost:10000/default> show create database test; |
五、删除库
1 | drop database dbname; |
默认情况下,hive 不允许删除包含表的数据库,有两种解决办法:
1、 手动删除库下所有表,然后删除库
2、 使用cascade
关键字
1 | delete database if exists dbname cascade; |
相当于是采用的严格restrict
模式
1、删除不带有表的数据库test
直接通过drop关键字进行删除
1 | 0: jdbc:hive2://localhost:10000/default> drop database test; |
- 删除带有表的库
选择先前worker
数据库,进入库中创建一个usrinfo
表
- 使用worker库
- 创建userinfo表
- 显示表的信息
1 | 0: jdbc:hive2://localhost:10000/default> use worker; |
如果此时删除worker
库,则会报错:
使用cascade
关键字解决
六、 使用表
1 | `USE database_name;``USE DEFAULT;` |
USE sets the current database for all subsequent HiveQL statements. To revert to the default database, use the keyword “
default
” instead of a database name.
七、选择数据库
1 | ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...); |
- 选择数据库,改变数据库的属性
- 选择数据库,改变数据库的用户
- 选择数据库,改变数据库的存放目录
表操作
一、创建表
- 方式1
1 | CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name # 建表 |
-
create table:创建一个表,指定名字;表若存在,则通过if not exists进行忽略;
-
Temporary:临时表
-
external:让用户创建一个外表
-
comment:用于表或者字段的注释
-
Partitioned by :指定分区字段
-
Clustered by:distributed by + sorted by的功能叠加
-
sorted by:保证同一个reduce中的数据是按照指定字段进行排序,同时指定执行的reduce 的个数(有序)
-
distributed by:按照那个指定的字段将数据划分到不同的输出reduce中,保证数据不重叠,但是数据是无序的(不重叠,无序)
-
row_format:指定字段之间的分隔符
-
file_format:
1
2
3
4
5
6
7
8file_format:
|SEQUENCEFILE # 序列化文件
| TEXTFILE # 文本文件
| RCFILE # 行列存储结合的文件格式
| ORC # 按照块的列存储
| PARQUET # 行存储格式文件
| AVRO # 序列化存储方式
| JSONFILE # json格式
- 方式2
1 | CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name |
创建表demo
- 在hive中创建好表user
1 | hive> create table user |
- 假设本地有个文件
/user/local/user.txt
1 | 1 wyp 25 13188888888888 |
通过如下方式进行导入并查看
1 | hive> load data local inpath 'user.txt' into table user; # 查看 |
各种表
一、内部表和外部表
- 内部表managed table
- 内部表也称之为
管理表
,其数据文件、元数据及统计信息全部由hive进程自身管理 - 存储位置:
/usr/hive/warehouse/dbname.db/tablename
- 删除内部表,则其全部数据会一同删除
- 创建临时表时,推荐内部表
- 外部表external table
- 通过元信息或者schema描述外部文件的结构
- 外部文件能够被hive之外的进程访问和管理,例如HDFS等
- 如果一份数据已经存储在HDFS上,并且被多个客户端进行使用,最好创建外部表
3、内部表和外部表demo
- 创建默认的内部表
1 | 0: jdbc:hive2://localhost:10000/default> create table workerinfo (id int, name string, sex string, age int) row format delimited fields terminated by ","; |
- 创建外部表
1 | 0: jdbc:hive2://localhost:10000/default> create external table student_ext(id int, name string, sex string, age int, department string) |
- 查看某个表的详细信息
1 | desc formatted student_ext; |
二、分区表和分桶表
1、 分区表
Hive select 查询时候,一般会扫描整个表,开销大,消耗时间。分区表指的是在创建表的时候,指定partition的分区空间,语法为:
1 | partitioned by (par_col, par_type) -- 指定字段和类型 |
- 静态分区:分区的值是确定的
- 动态分区:分区的值是不确定的,默认开始
hive
中默认的是动态分区开启状态
2、两种模式
严格模式:strict
,必须有一个字段是静态分区字段。
非严格模式:non strict
;允许所有的字段是动态分区字段。
设置方法:hive.exec.dynamic.partition.mode=strict/nonstrict
1 | 0: jdbc:hive2://localhost:10000/default> set hive.exec.dynamic.partition.mode; # 默认是strict模式 |
-
每个分区值都会形成一个具体的分区目录,数据文件一定要存储在某个分区中,而不能直接存储在表中。
-
分区字段是伪字段,不能与表定义字段重名
1 | # 假设某个表中存在3个字段 |
- 分桶表bucketed sorted tables
将已经执行了聚类和排序之后的表放入桶中,一个demo:
1 | 0: jdbc:hive2://localhost:10000/default> create external table student_bck(id int, name string, sex string, age int, department string) |
表的其他操作
- 查看当前使用的数据库中的表
1 | show tables; |
- 查看数据库中以xxx开头的表
1 | show tables like 'student*' -- 以student开头的表 |
- 查看表的详细信息
1 | desc student; |
- 查看建表的语句
1 | show create tabel student; |
- 修改表名
1 | alter table student rename to new_student; |
- 删除表
删除内表:将元数据信息和数据一起删除,实际上将数据移动到.Transh/Current目录,而元数据则是完全删除的;加了purge之后,数据删除干净!
删除外表:仅删除元数据,诗句仍在建表时指定的目录下
1 | drop table [if exists] student [pruge]; |
-
查看分区信息
1 | show partitions student_ptn; |
- 删除分区
1 | alter table student_ptn drop partition (city="shenzhen"); |
- 其他命令
Hive表的多种导入数据方式
- 从本地系统上导入数据(假设有数据worker.txt)
- 先在hive中创建表
- 将本地的数据导入
1 | -- hive中创建表 |
- 从HDFS中导入数据
假设HDFS上有一个文件/home/worker/test.txt
1 | hive>load data inpath '/home/worker/test.txt' into table user; |
- 从其他的表中查询出相应的数据并且导入到hive表
假设有一张test表,以age作为分区字段:
1 | hive> create table test( |
导入语句如下
1 | hive> insert into table test |
- CTAS导入方式
在实际情况中,表的输出结果可能太多,不适于显示在控制台上,此时将Hive的查询输出结果直接存在一个新的表中,非常方便
CTAS
指的是create table….. as select
。
1 | hive> create table test1 |