Hive支持常见的SQL语句, 除此之外它还有其独特的部分. 常见SQL语句与关系型数据库(例如MySQL)中的语法一致, 这里就不再做详细说明. 我们主要来看Hive中不一样的部分.
Hive的所有操作可以去Hive官网查看, 点击此处LanguageManual
Hive其实并不难, 对于有写过SQL语句的人来说会更简单. 在学习Hive时, 建议大家边学边敲, 多做联系.
既然要使用Hive就要有Hive的环境, 可以根据这篇博客来安装Hive以及与Hive相关的环境(Hadoop, Yarn)大数据生态圈搭建
这里我使用的是基于Mysql的远程模式来操作Hive.
连接进入Hive shell 之后, 先建一个新的数据库, 之后的大部分操作我们都在这个数据库中来练习.
创建:
create database hive_test;
使用该数据库:
use hive_test;
然后, 创建第一个表gfstbl, 也可使用数据库.表的格式(例如hive_test.gfstbl).
CREATE TABLE gfstbl(
id INT,
name STRING,
age INT,
gfs ARRAY<STRING>,
address MAP<STRING,STRING>,
info STRUCT<country:String,province:String,city:String>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
解释说明:
数据类型 | 注释 |
---|---|
tinyint | 短整型, 范围:-128~127 |
smallint | 小整型, -32768~32767 |
int | 整型, -232~232-1 |
bigint | 大整型, 就很大 |
float | 单精度浮点数 |
double | 双精度浮点数 |
decimal | 精度38位十进制数 |
date | 日期 |
timestamp | 时间戳 |
char | 字符 |
string | 字符串 |
varchar | 可变长度字符串 |
array | 数组类型 |
map | 键值对类型 |
structs | 结构化类型 |
创建表的SQL语句公式如下, 我们会根据Hive表的类型将这一公式分开操作.
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 [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)
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
LIKE existing_table_or_view_name
[LOCATION hdfs_path];
data_type
: primitive_type
| array_type
| map_type
| struct_type
| union_type -- (Note: Available in Hive 0.7.0 and later)
primitive_type
: TINYINT
| SMALLINT
| INT
| BIGINT
| BOOLEAN
| FLOAT
| DOUBLE
| DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
| STRING
| BINARY -- (Note: Available in Hive 0.8.0 and later)
| TIMESTAMP -- (Note: Available in Hive 0.8.0 and later)
| DECIMAL -- (Note: Available in Hive 0.11.0 and later)
| DECIMAL(precision, scale) -- (Note: Available in Hive 0.13.0 and later)
| DATE -- (Note: Available in Hive 0.12.0 and later)
| VARCHAR -- (Note: Available in Hive 0.12.0 and later)
| CHAR -- (Note: Available in Hive 0.13.0 and later)
array_type
: ARRAY < data_type >
map_type
: MAP < primitive_type, data_type >
struct_type
: STRUCT < col_name : data_type [COMMENT col_comment], ...>
union_type
: UNIONTYPE < data_type, data_type, ... > -- (Note: Available in Hive 0.7.0 and later)
row_format
: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char] -- (Note: Available in Hive 0.13 and later)
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
file_format:
: SEQUENCEFILE
| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)
| RCFILE -- (Note: Available in Hive 0.6.0 and later)
| ORC -- (Note: Available in Hive 0.11.0 and later)
| PARQUET -- (Note: Available in Hive 0.13.0 and later)
| AVRO -- (Note: Available in Hive 0.14.0 and later)
| JSONFILE -- (Note: Available in Hive 4.0.0 and later)
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
constraint_specification:
: [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE ]
[, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE
查看表结构的公式:
DESCRIBE [EXTENDED|FORMATTED] table_name
只查看表字段及类型, 结果如下图
DESC gfstbl;
或
DESCRIBE gfstbl;
极简方式查看表结构, 结果如下图
DESCRIBE EXTENDED gfstbl;
格式化方式查看表, 结果如下图
DESCRIBE FORMATTED gfstbl;
数据内容如下:
001 zhangsan 19 Girl1,Girl2,Girl3 Girl1:qingdao,Girl2:jinan,Girl3:nanjing zhongguo,shandong,weifang
002 lisi 20 GirlA,GirlB GirlA:American,GirlB:长沙 zhongguo,shandong,qingdao
将这两行数据复制到gfs.txt文件中
vim /root/gfs.txt
然后复制粘贴数据
load data local inpath '/root/gfs.txt' into table hive_test.gfstbl;
需要注意: load方式插入数据不会启动MR任务, load的实质是将文件上传到hdfs目录中.
select * from gfstbl;
hdfs dfs -ls /user/hive_meta/warehouse/hive_test.db/gfstbl
hdfs dfs -cat /user/hive_meta/warehouse/hive_test.db/gfstbl/*
3. 通过webUI页面
进图webUI页面, 找到文件对应位置
对于 数组 使用 : 列名[索引] 的形式查看(索引下标从0开始)
对于键值对使用 : 列名[“Key”]
对于结构体使用 : 列名.属性
select gfs[0],address["Girl2"],info.city from gfstbl;
drop table gfstbl2;
此处需要注意, 如果通过hdfs操作删除表所在的目录, hive中表还会存在. 原因在于mysql的hive_meta数据库中还存有该表的元数据信息.
CREATE TABLE gfstbl(
id INT,
name STRING,
age INT,
gfs ARRAY<STRING>,
address MAP<STRING,STRING>,
info STRUCT<country:String,province:String,city:String>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
create table gfstbl1 like gfstbl;
create table gfstbl2 AS SELECT id,name,gfs,address,info from gfstbl;
注意, 由于这种方式插入数据使用的是insert来插入数据, 因此会启动MR任务.
insert into table(col...) values(val...)
LOAD DATA INPATH '/a.txt' INTO TABLE user
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
或
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1
习惯上使用第二种语法, 即将from语句提前, 减少SQL代码的冗余.
from user
insert into user_count
select count(*)
insert into user_copy
select *;
删除表时,元数据与数据都会删除.
临时表
临时表的生命周期是一次会话, 当本次会话结束时, 临时表会自动删除.
外部表
删除表时, 元数据会被删除, 但数据(存放在HDFS)不会被删除.
分区表
将一批数据分成多个目录来存储, 从而防止暴力扫描. 分区表分为静态分区表和动态分区表.
分桶表
分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储. 由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中, 对于hive中每一个表、分区都可进一步分桶.
对这五种表的学习, 会在后续博客中再来讲解.