Hive官方操作手册
1 Hive特性
- hive基于Hadoop,将结构化数据映射为一张数据库表,提供类SQL查询功能
- Hive元数据存储,通常存储在关系形数据库中,Hive中的元数据包括(表的名称,列,分区,是否为外部表等属性,数据所在的路径)
- Hive支持MapReduce、Tez和Spark 三种计算引擎。
- 数据格式。数据格式用户定义,根据三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)
- 数据更新。不支持对数据的更新,使用更新可以借助Impala引擎+kudu数据格式
- 索引。有hive版本支持建立索引,但是各种问题,不建议使用。
- Hive中包含的数据模型,DB、Table,External Table,Partition,Bucket
- db:在hdfs中表现为
hive.metastore.warehouse.dir
目录下一个文件夹。
- table:在hdfs中表现所属db目录下一个文件夹。
- external table:与table类似,不过其数据存放位置可以在任意指定路径。
- partition:在hdfs中表现为table目录下的子目录。
- bucket:在hdfs中表现为同一个表目录下根据hash散列之后的多个文件。
2 Hive表类型
2.1 hive数据类型
- Hive的基本数据类型有:
TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,TIMESTAMP(V0.8.0+)和BINARY(V0.8.0+)
。
- Hive的集合类型有:
STRUCT,MAP和ARRAY
。
- Hive表:内部表、外部表、分区表和桶表。
- 表的元数据保存传统的数据库的表中,当前hive只支持Derby和MySQL数据库。
2.2 Hive内部表
Hive中的内部表和传统数据库中的表在概念上是类似的,Hive的每个表都有自己的存储目录,除了外部表外,所有的表数据都存放在配置在hive-site.xml
文件的${hive.metastore.warehouse.dir}/table_name
目录下。
1
2
3
4
5
6
|
-- 创建内部表
CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
grade STRING COMMOT '班级')COMMONT '学生表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS TEXTFILE;
|
2.3 Hive外部表
被external修饰的为外部表(external table),外部表指向已经存在在Hadoop HDFS上的数据,除了在删除外部表时只删除元数据而不会删除表数据外,其他和内部表很像
1
2
3
4
5
6
7
|
-- 创建外部表
CREATE EXTERNAL TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
class STRING COMMOT '班级')COMMONT '学生表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS SEQUENCEFILE
LOCATION '/usr/test/data/students.txt';
|
2.4 Hive分区表
分区表的每一个分区都对应数据库中相应分区列的一个索引,分区表中的每一个分区对应一个目录文件,即同一个分区的数据存放一个目录下面,所以分区表如果很大,指定分区会速度快很多
比如说,分区表partitinTable有包含nation(国家)、ds(日期)和city(城市)3个分区,其中nation = china,ds = 20130506,city = Shanghai则对应HDFS上的目录为:
/datawarehouse/partitinTable/nation=china/city=Shanghai/ds=20130506/
。
1
2
3
4
5
6
7
8
|
-- 创建分区表
CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
class STRING COMMOT '班级')COMMONT '学生表'
PARTITIONED BY (ds STRING,country STRING) -- 分区的列不属于建表的字段中
ROW FORMAT DELIMITED --分隔符
FIELDS TERMINATED BY ',' -- 结束换行符
STORE AS SEQUENCEFILE -- 数据存储格式
;
|
2.5 Hive分桶表
对指定列进行HASH,根据hash值进行切分数据,不同hash结果的数据写到每个桶对应的文件目录中
1
2
3
4
5
6
7
8
|
-- 创建分桶表
CREATE TABLE IF NOT EXISTS students(user_no INT,name STRING,sex STRING,
class STRING COMMOT '班级',score SMALLINT COMMOT '总分')COMMONT '学生表'
PARTITIONED BY (ds STRING,country STRING)
CLUSTERED BY(user_no) SORTED BY(score) INTO 32 BUCKETS -- 分桶
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORE AS SEQUENCEFILE;
|
2.6 Hive视图
逻辑数据结构,将查询结果作为视图,简化查询操作
1
2
3
4
5
6
7
8
|
CREATE VIEW employee_skills
AS
SELECT name, skills_score['DB'] AS DB,
skills_score['Perl'] AS Perl,
skills_score['Python'] AS Python,
skills_score['Sales'] as Sales,
skills_score['HR'] as HR
FROM employee;
|
2.7 总结
表的创建官方标准
LanguageManual DDL -创建表的语法结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]
[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]
[SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive 0.10.0 and later)]
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later)
]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive 0.6.0 and later)
[AS select_statement]; -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)
|
1
2
3
4
|
-- 用另外一个表的结构来创建
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
|
删除表
1
|
DROP TABLE [IF EXISTS] table_name [PURGE]; -- (Note: PURGE available in Hive 0.14.0 and later)
|
清空表
1
2
3
|
TRUNCATE [TABLE] table_name [PARTITION partition_spec];
partition_spec:
: (partition_column = partition_col_value, partition_column = partition_col_value, ...)
|