前言

之前写过Hive的安装,学习到了今天Hive的使用也有了一些的经验,Hive的基本命令与MySQL和SqlServer基本相似,都是建表建库那一套.但是Hive作为Hadoop的组件之一,肯定是有它特殊的意义,Hive在进行一些查询操作时,走的是MapReduce的流程,而Hive的底层封装了许多的MapReduce代码,用于减少使用人员学习MapReduce的学习成本,在熟悉hive的使用后,可以减少在学习MapReduce上的时间,但是作为Hadoop的三大组件之一的MapReduce也是要明白它的使用的.

DDL数据定义

create database 想创建的数据库名称;

建库命令与数据库的语言基本一致,

但是为了避免出现要创建的数据库已经存在错误,可以加入if not exists判断

create database if not exists 想创建的数据库名称 ;

同时在Hive创建的数据库是存放在HDFS上的,也可以自己指定在HDFS上的存放位置

create database 数据库名称 location 'hdfs上的位置';

查询数据库

显示数据库

hive> show databases;

即可查询到所有的数据库

过滤显示查询的数据库

show databases like '要查询的数据库名称';

查看数据库详情

hive> desc database 想要查看详情的数据库名称;

如图

数据库详情包括数据库存放地址,数据库类型

如果还想看更详细的可以加上extended

hive> desc database extended 想要查看详情的数据库名称;

如图

切换当前数据库

使用use命令切换数据库

hive (default)> use default;

修改数据库

修改hive的数据库,用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。

hive (default)> alter database db_hive set 
dbproperties('createtime'='20191105');

删除数据库

hive>drop database 要删除的数据库名称;

如果删除的数据库不存在,最好采用 if exists判断数据库是否存在

hive> drop database 删除的数据库(不存在);

FAILED: SemanticException [Error 10072]: Database does not exist: 数据库名称

hive> drop database if exists 数据库名称;

加上了if exists就不会报错

如果数据库不为空,可以采用cascade命令,强制删除

hive> drop database 数据库名称(数据库不为空);
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database 数据库名称 is not empty. One or more tables exist.)
hive> drop database 数据库名称 cascade;

建表命令

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]

建表字段解释说明

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

(2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

(3)COMMENT:为表和列添加注释。

(4)PARTITIONED BY创建分区表

(5)CLUSTERED BY创建分桶表

(6)SORTED BY不常用

(7)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或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。

SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。

(8)STORED AS指定存储文件类型

常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)

如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

(9)LOCATION :指定表在HDFS上的存储位置。

(10)LIKE允许用户复制现有的表结构,但是不复制数据。

管理表

Hive的表分为两种:一为外部表,二为内部表.内外表之间可以相互转换

默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。 当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。

建表语句内容太多,一篇博客是写不下的,所以目前先告一段落,请大家等待下次的更新,感谢大家的阅读.