目录
Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上,总归为大数据,并使得查询和分析方便。
HIVE交互
hive启动
hive [--database test] ##进入CLI交互界面,默认进入default数据库
hive -v ##冗余verbose模式,额外打印出执行的HQL语句
hive -S ##静默Slient模式,不显示转化MR-Job的信息,只显示最终结果
hive -i 'hive-init.sql' ##进入Hive交互Shell时候先执行脚本中的HQL语句
#-----web管理
hive --service serviceName ##启动web服务
#打开web页面
#-----hive 远程服务
hive --serve hiveserve &
hive命令行交互模式
hive> select * from dummy #执行HiveQL语句
hive> source ./hive-script.sql ##执行HQL脚本
hive> !echo 'hello hive' ##执行shell命令,前面加 !即可
shell窗口执行hive语句
hive -e 'show tables;' ##从命令行执行指定的HQL
hive -f 'hive-script.sql' ##执行HQL脚本
hive -S -e 'show tables;' ##静默模式
HIVE内置运算符
关系运算符 | 说明 |
---|---|
A = B | 等于 |
A != B | 不等于 |
A < B | 小于 |
A <= B | 大于等于 |
A > B | 大于 |
A >= B | 大于等于 |
A IS NULL | 空值 |
A IS NOT NULL | 非空 |
A LIKE B | 如果字符串模式A匹配到B |
A RLIKE B | 如果A任何子字符串匹配正则表达式B |
A REGEXP B | 字符串 |
算数运算符 | 描述 |
---|---|
A + B | |
A - B | |
A * B | |
A / B | |
A % B | 余数 |
A & B | A和B的按位与结果 |
A | B |
A ^ B | A和B的按位异或结果 |
~A | A按位非的结果 |
逻辑运算符 | 描述 |
---|---|
A AND B | |
A && B | 类似于 A AND B. |
A OR B | |
`A | |
NOT A | |
!A | 类似于 NOT A. |
复杂运算符 | 操作 | 描述 |
---|---|---|
A[n] | A是一个数组,n是一个int | 它返回数组A的第n个元素,第一个元素的索引0。 |
M[key] | M 是一个 Map 并 key 的类型为K | 它返回对应于映射中关键字的值。 |
S.x | S 是一个结构 | 它返回S的s字段 |
HIVE数据类型
数据类型 | 说明 |
---|---|
tinyint/smallint/int/bigint | 整数类型 |
float/double | 浮点型 |
Boolean | 布尔类型 |
string varchar(n)/char(n) |
字符串类型 |
array<data_type> |
数组类型,同一类型[val1,val2,...] |
map<key_type,value_type> |
集合类型,<key,value> |
struct<name1:type1,name2:type2,...> |
结构类型,包含不同类型 |
时间类型 | |
date | 只有日期部分 |
timestamp | 时间戳 |
hive的数据存储
- 基于HDFS
- 内部表 table:我们删除表的时候在hdfs上对应的目录及数据文件一同被删除了
- 分区表 partition:对于数据库中的超大型表,可以通过把它的数据分成若干个小表,从而简化数据库的管理活动
- 外部表 external:受控表在删除一个表的时候,会把hdfs中的目录给删除掉,外部表是你在删除这个表的时候只删除了表定义,对于h
- 桶表 bucket:经过hash运算后方在不同的桶中
HiveQL常用语句
HiveQL是Hive支持的类似于SQL的查询语言。HiveQL大体可以分成下面两种类型
- DDL(data definition language) 比如创建数据库(create database),创建表(create table),数据库和表的删除
- DML(data manipulation language) 数据的添加,查询
- UDF(user defined function) Hive还支持用户自定义查询函数
创建/删除数据库
CREATE DATABASE [IF NOT EXISTS] userdb;
DROP DATABASE [IF EXISTS] userdb;
创建/删除表
-------创建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] userdb.table_name (
id string COMMENT '主键',
name string COMMENT '字符',
age int COMMENT '整数',
married boolean COMMENT '布尔类型',
arr array<map<string,int>> COMMENT 'map数组',
info struct<addr:string,height:double,birth:date> COMMENT '结构类型',
)
COMMENT '表注释'
PARTITIONED BY(
date STRING COMMENT '日期分区',
sex STRING COMMENT '性别分区'
)
CLUSTERED BY(id) SORTED BY(num) INTO 32 BUCKETS
ROW FORMAT DELIMITED '\t'
FIELDS TERMINATED BY '\n'
STORED AS SEQUENCEFILE;
LOCATION 'hdfs_path';
--加上EXTERNAL时,建立外部表
--PARTITIONED BY 关键字建分区表
--CLUSTERED BY 关键字建Bucket表
--STORED AS 存储类型{SEQUENCEFILE:需要压缩,TEXTFILE:纯文本,RCFILE}
--LOCATION添加外部表存储路径
--------创建空表,复制表结构
CREATE TABLE [IF NOT EXISTS]empty_tablename
LIKE other_tablename;
--------直接导入数据
CREATE TABLE [IF NOT EXISTS]table_name
AS
SELECT ...;
--------删除表
DROP TABLE [IF EXISTS] table_name;
修改表结构
ALTER TABLE table_name
ADD COLUMNS (column_name [string COMMENT '新列'],...),
DROP [COLUMN] column_name,
RENAME TO new_name, --重命名表名
CHANGE column_name new_name new_type,
REPLACE COLUMNS (...); --替换表中所有字段
--添加/删除分区
ALTER TABLE table_name
ADD [IF NOT EXISTS] PARTITION (y='2018',m='07'),
DROP [IF EXISTS] PARTITION (y='2018',m='07');
--重命名分区
ALTER TABLE table_name PARTITION (y='2018',m='07')
RENAME TO PARTITION (y='18',m='07');
导入数据
--LOAD命令可以导入本地数据或者hdfs数据
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE table_name
PARTITION (
date='2018-07-03',
sex='M'
);
--LOCAL是标识符指定本地路径。它是可选的
--OVERWRITE是可选的,覆盖表中的数据
--PARTITION分区
插入数据
--将查询结果插入Hive表
INSERT [OVERWRITE] INTO TABLE table_name
PARTITION (y='2018',m='07')
SELECT ...;
--插入单条数据 (Hive 已支持单条插入)
INSERT INTO table_name VALUES('num',10086);
--将查询结果写入HDFS文件系统
INSERT OVERWRITE [LOCAL] DIRECTORY 'hdfs_path'
SELECT ...;
查询语句
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[ORDER BY col_list]
[LIMIT number];
--join语句,只支持等值连接
SELECT ...
FROM table_name
JOIN table1 ON join_condition
{LEFT|RIGHT|FULL} [OUTER] JOIN table1 ON join_condition
LEFT SEMI JOIN table3 ON join_condition
CROSS JOIN table4 ON join_condition;
--联合语句
select_statement
UNION ALL select_statement
UNION ALL select_statement;
其他常用命令
SHOW DATABASES/TABLES; --查看数据库/表
SHOW DATABASES/TABLES LIKE "*keyword*";
SHOW PARTITIONS test_table; --查看分区
SHOW FUNCTIONS; --查看内置函数
SHOW CREATE TABLE table_name; -- 查看建表语句
DESC table_name; -- 表结构
EXPLAIN select * from dual; -- 解释语句
TRUNCATE TABLE table_name; -- 清空表
HIVE常用内置函数
常用函数 | 描述 |
---|---|
count/sum/max/min/avg | 聚合函数 |
round(num,n) | 四舍五入 |
floor(num,n) | 地板 |
ceil(num,n) | 天花板 |
rand(), rand(int,seed) | 随机数 |
concat(string A, string B,…) | 它返回从A后串联B产生的字符串 |
substr(string A, int start, int length) | 取子集 |
upper(string A)/lower | |
trim(string A) | 删除两侧空格 |
ltrim(string A)/rtrim(string A) | 删除左/右空格 |
regexp_replace(string A, string B, string C) | 用C替换B |
size(Map<K.V>) |
它返回在映射类型的元素的数量。 |
size(Array<T>) |
它返回在数组类型元素的数量。 |
cast(<expr> as <type>) |
将表达式的结果转换类型 |
case when … then…else…end | |
between…and… | |
日期时间函数 | |
from_unixtime(int unixtime) | 转换的秒数从Unix纪元(1970-01-0100:00:00 UTC) |
to_date(string timestamp) | 返回一个字符串时间戳的日期部分 |
year(string date) | |
month(string date) | |
day(string date) | |
datediff(start,end) | 返回相差天数 |
date_add()/date_sub() | 日期加/减若干天数 |
get_json_object(string json_string, string path) |
Hive视图和索引
- 视图:逻辑表,不存储实际数据
- 索引:
--创建视图
CREATE VIEW [IF NOT EXISTS] view_name
(column_name COMMENT '列说明', ...)
TBLPROPERTIES (property_name = property_value, ...)
COMMENT '视图注释'
AS SELECT ...;
--删除试图
DROP VIEW view_name;
--创建索引
CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)]
[ ROW FORMAT ...] [STORED AS ...| STORED BY ...]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)];
--删除索引
DROP INDEX <index_name> ON <table_name>
hive性能调优
https://blog.csdn.net/myproudcodelife/article/details/45372467
参考链接
https://www.yiibai.com/hive
https://blog.csdn.net/u012386109/article/details/78214894
https://www.cnblogs.com/skyl/p/4736129.html