Hive SQL操作
7、修改表
-
表重命名
alter table score4 rename to score5;
-
修改表属性值
修改内外表属性
ALTER TABLE table_name SET TBLPROPERTIES("EXTERNAL"="TRUE");
修改表注释
ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);
-
其余属性可参见
点此官网链接查看 -
添加分区
ALTER TABLE tablename ADD PARTITION (month='201101');
-
修改分区值
ALTER TABLE tablename PARTITION (month='202005') RENAME TO PARTITION (month='201105');
-
删除分区
ALTER TABLE tablename DROP PARTITION (month='201105');
-
添加列
ALTER TABLE table_name ADD COLUMNS (v1 int, v2 string);
-
修改列名
ALTER TABLE test_change CHANGE v1 v1new INT;
-
清空表(只可以清空内部表)
TRUNCATE TABLE tablename;
-
删除表
DROP TABLE tablename;
8、数组类型(array)
-
如下数据文件,有2个列,locations列包含多个城市:
说明:name与locations之间制表符分隔,locations中元素之间逗号分隔
可以使用array数组类型,存储locations的数据
建表语句:create table myhive.test_array(name string, work_locations array<string>)
row format delimited fields terminated by '\t'
COLLECTION ITEMS TERMINATED BY ',';

-
常用查询语句
查询所有数据
select * from myhive.test_array;
查询loction数组中第一个元素
select name, work_locations[0] location from myhive.test_array;
查询location数组中元素的个数
select name, size(work_locations) location from myhive.test_array;
查询location数组中包含tianjin的信息
select * from myhive.test_array where array_contains(work_locations,'tianjin');
9、映射类型(map)
-
map类型其实就是简单的指代:Key-Value型数据格式。 有如下数据文件,其中members字段是key-value型数据
字段与字段分隔符: ",";需要map字段之间的分隔符:"#";map内部k-v分隔符:":"
-
建表语句
create table myhive.test_map(
id int, name string, members map<string,string>, age int
)
row format delimited
fields terminated by ','
COLLECTION ITEMS TERMINATED BY '#'
MAP KEYS TERMINATED BY ':';

-
常用查询语句
查询全部
select * from myhive.test_map;
查询father、mother这两个map的key
select id, name, members['father'] father, members['mother'] mother, age from myhive.test_map;
查询全部map的key,使用map_keys函数,结果是array类型
select id, name, map_keys(members) as relation from myhive.test_map;
查询全部map的value,使用map_values函数,结果是array类型
select id, name, map_values(members) as relation from myhive.test_map;
查询map类型的KV对数量
select id,name,size(members) num from myhive.test_map;
查询map的key中有brother的数据
select * from myhive.test_map where array_contains(map_keys(members), 'brother');
10、结构类型(struct)
-
struct类型是一个复合类型,可以在一个列中存入多个子列,每个子列允许设置类型和名称
有如下数据文件,说明:字段之间#分割,struct之间冒号分割
-
建表语句
create table myhive.test_struct(
id string, info struct<name:string, age:int>
)
row format delimited
fields terminated by '#'
COLLECTION ITEMS TERMINATED BY ':'; -
常用查询
select * from hive_struct;
直接使用列名.子列名 即可从struct中取出子列查询
select ip, info.name from hive_struct;
11、数据查询
-
查询语句基本语法如下(跟普通数据库sql查询基本一样):
SELECT [ALL | DISTINCT]select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BYcol_list] [HAVING where_condition] [ORDER BYcol_list] [CLUSTER BYcol_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number]
排序查询
SELECT * FROM orders WHERE useraddress like '%广东%' ORDER BY totalmoney DESC LIMIT 1;
分组查询
SELECT userid, AVG(totalmoney) AS avg_money FROM itheima.orders GROUP BY userid HAVING avg_money > 10000;
Join连接查询
SELECT o.orderid, o.userid, u.username, o.totalmoney, o.useraddress, o.paytime FROM itheima.orders o LEFT JOIN itheima.users u ON o.userid = u.userid;
RLIKE查询(支持正则)
SELECT * FROM itheima.orders WHERE useraddress RLIKE '.广东.';
SELECT * FROM itheima.orders WHERE userphone RLIKEE '188\S{4}0\S{3}';UNION查询
SELECT t_id FROM itheima.course WHERE t_id = '周杰轮'
UNION ALL
SELECT t_id FROM itheima.course WHERE t_id = '王力鸿'
12、数据抽样
-
基于随机分桶抽样语法:
SELECT ... FROM tbl TABLESAMPLE(BUCKET x OUT OF y ON(colname | rand()))
SELECT * FROM orders TABLESAMPLE(BUCKET 1 OUT OF 10 ON rand());
-
基于数据块抽样语法(每一次抽样的结果都一致):
SELECT ... FROM tbl TABLESAMPLE(num ROWS | num PERCENT | num(K|M|G));
-
num ROWS 表示抽样num条数据
-
num PERCENT 表示抽样num百分百比例的数据
-
num(K|M|G) 表示抽取num大小的数据,单位可以是K、M、G表示KB、MB、GB
SELECT * FROM orders TABLESAMPLE(num rows);
13、虚拟列
- 虚拟列是Hive内置的可以在查询语句中使用的特殊标记,可以查询数据本身的详细参数。
- Hive目前可用3个虚拟列:
-
INPUT__FILE__NAME,显示数据行所在的具体文件
-
BLOCK__OFFSET__INSIDE__FILE,显示数据行所在文件的偏移量
-
ROW__OFFSET__INSIDE__BLOCK,显示数据所在HDFS块的偏移量
注:此虚拟列需要设置:SET hive.exec.rowoffset=true 才可使用SELECT *, INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE, ROW__OFFSET__INSIDE__BLOCK FROM course;
Hive函数
-
Hive的函数分为两大类:内置函数(Built-in Functions)、用户定义函数UDF(User-Defined Functions):
Hive函数官方文档,点此查看 -
Hive内置函数(举例说明)
查看当下可用的所有函数
show functions
查看函数的使用方式
describe function extended funcname
-
数学函数
取整函数: round 返回double类型的整数值部分 (遵循四舍五入)
select round(3.1415926);
指定精度取整函数: round(double a, int d) 返回指定精度d的double类型
select round(3.1415926,4);
取随机数函数: rand 每次执行都不一样 返回一个0到1范围内的随机数
select rand();
指定种子取随机数函数: rand(int seed) 得到一个稳定的随机数序列
select rand(3);
求数字的绝对值
select abs(-3);
得到pi值(小数点后15位精度)
select pi();
-
集合函数
-
类型转换函数
-
日期函数
-
条件函数
-
数据脱敏函数
-
字符串函数
-
其他函数
至此,Apache Hive的基本使用语法分享结束!!!