HIve Hql语句

官网DDL(Data Definition Language 数据定义语言)

官网DML(Data Manipulation Language 数据操作语言)


001、DDL

符号解释:
    ( ):里面的参数选择一个作为此次命令参数。
    [ ]: 里面的参数可选可不选。  
     | : 或
优化设置:
    set hive.cli.print.current.db=true;:显示当前所在的数据库

  • Database

创建

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

参数解释:
    database|schema:选择此次创建的格式是什么
    IF NOT EXISTS:如果不存在则创建,存在则忽略
    comment: 设置描述信息
    location:设置此次创建保存到其他HDFS目录,默认为:dfs://master:9000/user/hive/warehouse/database_name.db
    with dbproperties(k=v,...):设置key=value形式的描述。

删除

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

参数解释:
    database|schema:选择此次删除的格式是什么
    IF EXISTS:如果存在则删除,不存在忽略
    restrict:如果数据库中存在数据表,则不让删除数据库。默认选项
    cascade:强制删除数据库,无论是否存在表

修改

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);  
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;
ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path;

命令解释:
    对面三条分别对应修改数据库的:
        DBPROPERTIES:keyValue形式的描述;
        owner:拥有着权限
        location:在hdfs中的目录

查看

# 查看所有的database或者schemas
SHOW (DATABASES|SCHEMAS) [LIKE 'identifier_with_wildcards'];

参数解释:
    database|schema:选择此次查看的格式是什么
    like:支持模糊查询

# 查看指定的database或者schemas的详细信息
describe (DATABASES|SCHEMAS) [extended] db_name;

参数解释:
    database|schema:选择此次查看的格式是什么
    extended:查看创建时指定的dbproperties设置的属性。

切换数据库

USE database_name;

  • Table

创建

# 001
create [external] table [if not exists] [db_name.]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, ...)];

参数解释:
    * external:如果指定此参数,那么创建的表为外部表。
    * if not exists:判断是否存在,如果不存在则创建,存在跳过。只判断表名而不校验里面的数据列。
    * db_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:构建分桶;
        col_name:根据那一列构建分桶;
        sorted by (col_name [asc|desc], ...):根据那一列进行排序以及排序规则
        into num_buckets buckets:放置到几个桶内以及桶的名称
    * row format row_format:指定分隔符,分隔符分类大概为以下几类:
        # hive 建表的时候默认的分割符是'\001',若在建表的时候没有指明分隔符,load 文件的时候文件的分隔符需要是'\001';若文件分隔符不是'001',程序不会报错,但表查询的结果会全部为'null';
        # 在使用下列参数之前需要开启指明format类型,一般使用delimited,即:row format delimited
        [fields terminated by char]: 列的分隔符,一般使用','
        [collection items terminated by char]: 数组的分隔符,一般使用'-'
        [map keys terminated by char]: map的分隔符,一般使用':'
        [lines terminated by char] : 行的分隔符,一般使用默认'\n'
        [NULL DEFINED AS char] : 空指的格式化,一般使用''
        serde serde_name [with serdeproperties(property_name=property_value, property_name=property_value,...)] :一些其余的配置,暂时没了解...
    * stored as sequencefile|textfile|rcfile:修改文件格式
        # 如果文件数据是纯文本,可以使用 stored as textfile。如果数据需要压缩,使用 stored as sequencefile。
    # textfile是默认的文件格式,使用 delimited子句来读取分隔的文件。
  * location hdfs_path:设置保存目录,默认为hive目录下
  * tblproperties(property_name=property_value, ...): 这是key=value形式的描述

# 002
格式等同于001 最后可以加
    [AS select_statement];
    # 通过AS 查询语句完成建表:将子查询的结果存在新表里,有数据。一般用于中间表

# 003
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE existing_table_or_view_name
  [LOCATION hdfs_path];

会创建结构完全相同的表,但是没有数据。    

参数解释:同#001

删除

DROP TABLE [IF EXISTS] table_name [PURGE];

参数解释:
    IF EXISTS: --
    PURGE:数据不会放到回收箱,会直接删除

修改

# 001 修改表的属性
* ALTER TABLE table_name RENAME TO new_table_name;  // 修改表名
* ALTER TABLE table_name SET TBLPROPERTIES table_properties;  // 修改表key=value形式的描述
* ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);   // 修改表的描述,只能改和增不能删除

# 002 修改分区属性
* ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'];
    // 添加一个新的分区
    partition_spec:就是创建表的时候的那个字段,key=value
* ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;
    // 修改分区名称
* ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";
    // 修改分区路径;如果不加分区则修改表的路径
* ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec [IGNORE PROTECTION] [PURGE];
    // 删除分区信息
    IGNORE PROTECTION: 强制删除
    purge:不会放到回收箱,直接删除
* ALTER TABLE table_name_2 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_1;
    // 转移分区,从一个表中转移到另一个表
    
# 003 修改列属性
*ALTER TABLE table_name  CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name] [CASCADE|RESTRICT];
    // 修改列的名称,列的属性,列的备注,以及列的位置和权限
*ALTER TABLE table_name  [PARTITION partition_spec]  ADD|REPLACE COLUMNS  [CASCADE|RESTRICT]    
    // 添加或者替换列。如果使用replace替换的话,则会替换原表中的所有列。

查看

* SHOW TABLES [IN database_name] ['identifier_with_wildcards'];
    // 查看所有表,后面可以指定数据库,还可以添加正则表达
* SHOW PARTITIONS [db_name.]table_name [PARTITION(partition_spec)];
    // 查看某个表的所有分区信息。
* show tblproperties table_name;
    // 查看表的key-value描述
* describe table_name;
    // 查看表基本信息,后面可以追加参数:
    // extended:查看所有信息,但是比较乱。
    // formatted:也是查看所有,但是格式化了比较好看。
* SHOW COLUMNS (FROM|IN) table_name [(FROM|IN) db_name];
    // 查看某个表的列数据