目录

1、DDL 操作 

1.1、库操作 

1.1.1、创建库 

1.1.2、查看库 

1.1.3、删除库 

1.1.4、切换库 

1.2、表操作 

1.2.1、创建表 

1.2.2、修改表 

1.2.3、删除表 ​ 

1.2.4、清空表 ​ 

1.3、其他辅助命令 ​ 


1、DDL 操作 

1.1、库操作 

1.1.1、创建库 

语法结构: 

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name   [COMMENT database_comment]  

[LOCATION hdfs_path]  

[WITH DBPROPERTIES (property_name=property_value, ...)]; 

创建库的使用方式: 

1、 创建普通库 create database dbname; 

2、 创建库的时候检查存与否 create databse if not exists dbname; 

3、 创建库的时候带注释 create database if not exists dbname comment 'create my db named dbname'; 

4、 创建带属性的库

create database if not exists dbname with dbproperties ('a'='aaa','b'='bbb');

create database if not exists myhive with dbproperties ('a'='aaa','b'='bbb'); 

1.1.2、查看库 

1、查看有哪些数据库  show  databases; 

2、显示数据库的详细属性信息  语法:desc  database  [extended]  dbname;  示例:desc  database  extended  myhive; 

3、查看正在使用哪个库  select current_database(); 

4、查看创建库的详细语句  show create database mydb; 

1.1.3、删除库 

删除库操作:  drop database dbname;  drop database if exists dbname; 

默认情况下,hive 不允许删除包含表的数据库,有两种解决办法: 

1、 手动删除库下所有表,然后删除库 

2、 使用 cascade 关键字

drop database if exists dbname cascade;

默认情况下就是 restrict

drop database if exists myhive ==== drop database if exists myhive restrict 

1.1.4、切换库 

切换库操作: 语法:use database_name 实例:use myhive; 

1.2、表操作 

1.2.1、创建表 

1、 建表语句

语法结构: 

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] 

详情请参见: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualD DL-CreateTable 

2、 建表语句相关解释 

CREATE TABLE:

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

EXTERNAL

关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的 路径(LOCATION), 如果不存在,则会自动创建该目录。Hive 创建内部表时,会将数据 移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置 做任何改变。 

在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删 除数据。(经典面试问题) 

外部表和内部表的选择: 

1、 如果数据已经存储在 HDFS 上了,然后需要使用 Hive 去进行分析,并且该份数据还 有可能要使用其他的计算引擎做计算之用,请使用外部表

2、 如果一份数据仅仅只是使用 Hive 做统计分析,那么可以使用内部表 

不管使用内部表和外部表,表的数据存储路径都是可以通过 location 指定的!!!!!! 

推荐方式:

1、 创建内部表的时候,最好别指定 location,就存储在默认的仓库路径

2、 如果要指定外部路径,那么请创建该表为外部表 

PARTITIONED BY

在 Hive Select 查询中一般会扫描整个表内容,会消耗很多时间做没必要 的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入 partition 概念。个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下, 分区是以字段的形式在表结构中存在,通过 desc table 命令可以查看到字段存在,但是 该字段不存放实际的数据内容,仅仅是分区的表示。

分区建表分为 2 种: 一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录 ; 一种是多分区,表文件夹下出现多文件夹嵌套模式 

LIKE:

允许用户复制现有的表结构,但是不复制数据。 示例:create table tableA like tableB(创建一张 tableA 空表复制 tableB 的结构)

COMMENT:

可以为表与字段增加描述 

ROW FORMAT :

Hive 基本操作 ---DDL
用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为 表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表 的具体的列的数据。 

STORED AS

TEXTFILE | SEQUENCEFILE | RCFILE 如果文件数据是纯文本,可以使用 STORED AS TEXTFILE,默认也是 textFile 格式,可以通 过执行命令 set hive.default.fileformat,进行查看,如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

A、默认格式 TextFile,数据不做压缩,磁盘开销大,数据解析开销大。可结合 gzip、bzip2 使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive 不会对数据进行切 分,从而无法对数据进行并行操作 
 
B、SequenceFile 是 Hadoop API 提供的一种二进制文件支持,文件内容是以序列化的 kv 对象来组织的,其具有使用方便、可分割、可压缩的特点。 SequenceFile 支持三种压缩 选择:NONE,RECORD,BLOCK。Record 压缩率低,一般建议使用 BLOCK 压缩 
 
C、RCFILE 是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个 record 在一个块上,避免读一个记录需要读取多个 block。其次,块数据列式存储,有利 于数据压缩和快速的列存取。相比 TEXTFILE 和 SEQUENCEFILE,RCFILE 由于列式存储方式, 数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次 写入、多次读取,因此,整体来看,RCFILE 相比其余两种格式具有较明显的优势 

CLUSTERED BY 

对于每一个表(table)或者分区,Hive 可以进一步组织成桶,也就是说桶是更为细 粒度的数据范围划分。Hive 也是针对某一列进行桶的组织。Hive 采用对列值哈希,然后 除以桶的个数求余的方式决定该条记录存放在哪个桶当中。 

把表(或者分区)组织成桶(Bucket)有两个理由: 

(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询 时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表, 可以使用 Map 端连接(Map Join)高效的实现。比如 JOIN 操作。对于 JOIN 操作两个表 有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行 JOIN 操作就可以,可以大大较少 JOIN 的数据量。

(2)使取样(Sampling)更高效。在处理大规模数据集时,在开发和修改查询的 阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。 

LOCATION:

指定数据文件存放的 HDFS 目录,不管内部表还是外表,都可以指定。不指 定就在默认的仓库路径。 

最佳实践:  如果创建内部表请不要指定 location  如果创建表时要指定 location,请创建外部表。 

3、 Hive 建表示例 

Hive 基本操作 ---DDL

执行命令查看表结构:hive> desc formatted page_view; 

Hive 基本操作 ---DDL 

Hive 基本操作 ---DDL

Hive 基本操作 ---DDL 

Hive 使用一个 Inputformat 对象将输入流分割成记录;使用一个 Outputformat 对象将记录格 式化为输出流,使用序列化/反序列化器 SerDe 做记录的解析(记录和列的转换) 。 它们的默认值分别是: 

Inputformat:org.apache.hadoop.mapred.TextInputFormat

Outputformat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat

SerDe:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  

4、 具体实例 

a、 创建内部表 

create table mytable (id int, name string)  row format delimited fields terminated by ',' stored as textfile; 

Hive 基本操作 ---DDL

Hive 基本操作 ---DDL 

b、 创建外部表 

create external table mytable2 (id int, name string) row format delimited fields terminated by ',' location '/user/hive/warehouse/mytable2'; 

Hive 基本操作 ---DDL 

c、 创建分区表 

create table mytable3(id int, name string) partitioned by(sex string)  row format delimited fields terminated by ',' stored as textfile; 

Hive 基本操作 ---DDL 

Hive 基本操作 ---DDL 

d、 创建分桶表 

create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string) clustered by(Sno) sorted by(Sno DESC) into 4 buckets row format delimited fields terminated by ','; 

 Hive 基本操作 ---DDL

e、 使用 like 关键字拷贝表 

// 不管老表是内部表还是外部表,new_table 都是内部表 

create table new_table like mytable; 

// 不管老表是内部表还是外部表,如果加 external 关键字,new_table 都是外部表 

create external table if not exists new_table like mytable; 

1.2.2、修改表 

1、重命名表 

语法结构:ALTER TABLE table_name RENAME TO new_table_name 

示例: 

Hive 基本操作 ---DDL

2、修改表属性 

语法结构: 

ALTER TABLE table_name SET TBLPROPERTIES table_properties; table_properties: (property_name = property_value, property_name = property_value, ... ) 

实例: 

ALTER TABLE table_name SET TBLPROPERTIES ('comment' = 'my new students table'); 

不支持修改表名,和表的数据存储目录 

3、修改 SerDe 信息 

语法结构: 

Hive 基本操作 ---DDL 

实例: 

更改列分隔符:ALTER TABLE student SET SERDEPROPERTIES ('field.delim' = '-'); 

4、增加/删除/改变/替换列 

 语法结构: 

Hive 基本操作 ---DDL

(注意:ADD 是代表新增一字段,字段位置在所有列后面(partition 列前),REPLACE 则是表 示替换表中所有字段)

ADD 示例: 

Hive 基本操作 ---DDL 

Hive 基本操作 ---DDL 

5、增加/删除分区 

增加分区语法结构: 

Hive 基本操作 ---DDL 

删除分区语法结构: 

Hive 基本操作 ---DDL 

Hive 基本操作 ---DDL 

Hive 基本操作 ---DDL 

1.2.3、删除表 

Hive 基本操作 ---DDL 

1.2.4、清空表 

Hive 基本操作 ---DDL 

1.3、其他辅助命令 

Hive 基本操作 ---DDL 

Hive 基本操作 ---DDL 

 


 

 

 

相关文章: