一、HQL操作之 -- DDL命令

~~~     [Hive_DDL数据库操作]
~~~ [Hive_DDL之建表语法]
~~~ [Hive_DDL之内部表和外部表]
~~~ [Hive_DDL之分区表]
~~~ [Hive_DDL之分桶表]
~~~ [Hive_DDL之修改表及删除表]
### --- HQL操作

~~~ 参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
~~~ DDL(data definition language): 主要的命令有CREATE、ALTER、DROP等。
~~~ DDL主要是用在定义、修改数据库对象的结构 或 数据类型。

|NO.Z.00007|——————————|BigDataEnd|——|Hadoop&Hive.V07|——|Hive.v07|Hive_DDL数据库操作.v01|_hive


二、数据库操作

### --- Hive有一个默认的数据库default,

~~~ 在操作HQL时,如果不明确的指定要使用哪个库,则使用默认数据库;
~~~ Hive的数据库名、表名均不区分大小写;
~~~ 名字不能使用数字开头;
~~~ 不能使用关键字,尽量不使用特殊符号;
~~~     # 创建数据库语法

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[MANAGEDLOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
~~~     # 创建数据库,在HDFS上存储路径为 /user/hive/warehouse/*.db

hive (default)> create database mydb;
hive (default)> dfs -ls /user/hive/warehouse;
drwxrwxrwx - root supergroup 0 2021-08-22 10:54 /user/hive/warehouse/mydb.db
~~~     # 避免数据库已经存在时报错,使用 if not exists 进行判断【标准写法】

hive (default)> create database if not exists mydb;
~~~     # 创建数据库。添加备注,指定数据库在存放位置

hive (default)> create database if not exists mydb2
comment 'this is mydb2'
location '/user/hive/mydb2.db';
### --- 查看数据库

~~~ # 查看所有数据库
show database;
~~~     # 查看数据库信息
desc database mydb2;
desc database extended mydb2;
describe database extended mydb2;
~~~     # 使用数据库

use mydb;
### --- 删除数据库

~~~ # 删除一个空数据库
drop database databasename;

~~~ # 如果数据库不为空,使用 cascade 强制删除
drop database databasename cascade;

三、建表语法

create [external] table [IF NOT EXISTS] table_name
[(colName colType [comment 'comment'], ...)]
[comment table_comment]
[partition by (colName colType [comment col_comment], ...)]
[clustered BY (colName, colName, ...)
[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];
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS]
[db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
~~~     CREATE TABLE。按给定名称创建表,如果表已经存在则抛出异常。可使用if notexists 规避。
~~~ EXTERNAL关键字。创建外部表,否则创建的是内部表(管理表)。
~~~ 删除内部表时,数据和表的定义同时被删除;
~~~ 删除外部表时,仅仅删除了表的定义,数据保留;
~~~ # 在生产环境中,多使用外部表;
~~~ comment。表的注释
~~~ partition by。对表中数据进行分区,指定表的分区字段
~~~ clustered by。创建分桶表,指定分桶字段
~~~ sorted by。对桶中的一个或多个列排序,较少使用
~~~ 存储子句。
ROW FORMAT DELIMITED
[FIELDS TERMINATED BY char]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char] | SERDE serde_name
[WITH SERDEPROPERTIES (property_name=property_value,
property_name=property_value, ...)]
~~~     建表时可指定 SerDe 。如果没有指定 ROW FORMAT 或者 ROW FORMATDELIMITED,将会使用默认的 SerDe。
~~~ 建表时还需要为表指定列,在指定列的同时也会指定自定义的 SerDe。Hive通过 SerDe 确定表的具体的列的数据。
~~~ # SerDe是 Serialize/Deserilize 的简称, hive使用Serde进行行对象的序列与反序列化。
~~~     stored as SEQUENCEFILE|TEXTFILE|RCFILE。如果文件数据是纯文本,可以使用 STORED AS                     TEXTFILE(缺省);如果数据需要压缩,使用 STORED ASSEQUENCEFILE(二进制序列文件)。
~~~ LOCATION。表在HDFS上的存放位置
~~~ TBLPROPERTIES。定义表的属性
~~~ AS。后面可以接查询语句,表示根据后面的查询结果创建表
~~~ LIKE。like 表名,允许用户复制现有的表结构,但是不复制数据

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart

                                                                                                                                                   ——W.S.Landor