大数据手册(Hive)--HiveQL

目录


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

猜你喜欢

转载自blog.csdn.net/qq_41518277/article/details/80902191