目录
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 :
用户在建表的时候可以自定义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> desc formatted page_view;
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;
b、 创建外部表
create external table mytable2 (id int, name string) row format delimited fields terminated by ',' location '/user/hive/warehouse/mytable2';
c、 创建分区表
create table mytable3(id int, name string) partitioned by(sex string) row format delimited fields terminated by ',' stored as textfile;
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 ',';
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
示例:
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 信息
语法结构:
实例:
更改列分隔符:ALTER TABLE student SET SERDEPROPERTIES ('field.delim' = '-');
4、增加/删除/改变/替换列
语法结构:
(注意:ADD 是代表新增一字段,字段位置在所有列后面(partition 列前),REPLACE 则是表 示替换表中所有字段)
ADD 示例:
5、增加/删除分区
增加分区语法结构:
删除分区语法结构:
1.2.3、删除表
1.2.4、清空表
1.3、其他辅助命令