Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据表,并提供类似于SQL(HiveSQL)的操作功能。在Hive中,本质上是将SQL转换成为MapReduce程序。
Hive的基本操作与传统的数据库的操作类似,所不同的是Hive的SQL语句会转换成MapReduce程序执行,对于特定的查询等操作,具有更高的性能。使用的前提是假设已经搭建好Hive以及Hadoop集群基本上。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业。
CREATE DARABASE name;
显示查看操作命令
show tables; --显示表
show databases; --显示数据库
show partitions table_name; --显示表名为table_name的表的所有分区
show functions ; --显示所有函数
describe extended table_name col_name; --查看表中字段
数据库定义语言
创建表结构
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]
创建带索引字段的表:
CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (dindex STRING);
显示所有表:
SHOW TABLES;
按正则表达式显示表:
SHOW TABLES '.*s';
表中添加一个字段:
ALTER TABLE pokes ADD COLUMNS (new_col INT);
添加一个字段并为其添加注释:
ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
删除列:
ALTER TABLE test REPLACE COLUMNS(id BIGINT, name STRING);
更改表名:
ALTER TABLE events RENAME TO new_events;
数据操作语言,主要是数据库增删改三种操作,DML包括:INSERT插入、UPDATE新、DELETE删除。
向数据表内加载文件:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
–load操作只是单纯的复制/移动操作,将数据文件移动到Hive表对应的位置。
–加载本地
LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
–加载HDFS数据,同时给定分区信息
LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
将查询结果插入到HDFS文件系统中:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]
SELECT查询结构:
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[ CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]
将查询数据输出至目录:
INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='' ;
将查询结果输出至本地目录:
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes
Hive 只支持等值连接(equality joins)、外连接(outer joins)和(left semi joins)。Hive 不支持所有非等值的连接,因为非等值连接非常难转化到 map/reduce 任务。
join查询时应注意的点:
–只支持等值连接
SELECT a.* FROM a JOIN b ON (a.id = b.id)
SELECT a.* FROM a JOIN b ON (a.id = b.id AND a.department = b.department)
–可以 join 多个表
SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
–如果join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务
LEFT,RIGHT和FULL OUTER关键字
--左外连接
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)
--右外链接
SELECT a.val, b.val FROM a RIGHT OUTER JOIN b ON (a.key=b.key)
--满外连接
SELECT a.val, b.val FROM a FULL OUTER JOIN b ON (a.key=b.key)
UNION 与 UNION ALL
--用来合并多个select的查询结果,需要保证select中字段须一致
select_statement UNION ALL select_statement UNION ALL select_statement ...
--UNION 和 UNION ALL的区别
--UNION只会查询到两个表中不同的数据,相同的部分不会被查出
--UNION ALL会把两个表的所有数据都查询出