查看所有的数据库
show databases;
创建数据库
create database if not exists myhive;
use myhive;
说明:hive的表的存放位置模式是由hive-site.xml当中的一个数据指定的
<name>hive.metastore.warehouse.dir<\name>
<value>/user/hive/warehouse<\value>
创建数据库并指定位置
create database myhive2 location ‘/myhive2’;
设置数据库键值信息
数据库可以有一些描述性的键值对信息,在创建时添加
create database foo with dbproperties(‘owner’=‘duck’,‘date’=‘2021-04-07’);
查看数据库键值对信息
describe database extended foo;
修改数据库的键值对信息
alter database foo set dbproperties(‘owner’=‘dake’);
查看数据库更多详细信息
desc database foo extended myhive;
删除数据库
删除一个空的数据库,如果数据库中有表,就会报错
drop database myhive;
强制删除数据库,包含库中的表一起删除
drop database myhive cascade;
从数据库中模糊查询表
show tables like ‘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]
说明:
external:可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(location),hive创建内部表时,会将数据移动到数据仓库指定的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变,在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据
comment : 表示注释默认不能使用中文
【内部表操作】
创建表并指定字段之间的分隔符
create table if not exist per(id int,name string) row format delimited fields terminated by ‘\t’;
创建表并指定表文件的存储路径
create table if not exist per(id int,name string) row format delimited fields terminated by ‘\t’ location ‘/user/per’;
根据查询结果创建一张表
create table per1 as select * from per; #通过复制表结构和表内容创建表
根据已存在的表结构创建表
create table per2 like per; #只复制表结构
查询表的详细信息
desc formatted tablename;
删除表
drop table tablename;
修改表结构
重命名:
alter table score4 rename to score5;
增加/修改列信息:
1.查询表结构
desc score5;
2.添加列
alter table score5 add columns (mycol string,mysco int);
3.更新列
alter table score5 change column 列原始名 列新名 int(列新的类型);
4.删除表
drop table tablename;
创建视图
CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], …) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, …)] AS SELECT;
删除视图
DROP VIEW view_name;
【外部表操作】
外部表说明
外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据仍然存放在hdfs中,不会删掉
内部表和外部表的使用场景
外部表对HDFS文本文件做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过select + insert进入内部表
操作案例
创建老师与学生外部表,并向表中加载数据
创建老师表
create external table teacher (t_id string,t_name string) row format delimited fields terminated by ‘\t’;
创建学生表
create external table teacher (s_id string,s_name string,s_birth string,s_sex string) row format delimited fields terminated by ‘\t’;
加载数据
load data local inpath ‘/export/student.csv’ into table student;
加载数据并覆盖已有数据
load data local inpath ‘/export/student.csv’ overwrite into table student;
从hdfs文件系统中向表中加载数据(需要提前将数据上传到hdfs文件系统)
load data inpath ‘hivedatas/teacher.csv’ into table teacher;
Hive表查询语法分析
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]
- order by 会对输入做全局排序,因此只有一个reducer,会导致当输入规模比较大时,需要较长的计算时间。
- sort by 不是全部排序,其在数据进入reducer前完成排序。因此,如果用sort by 进行排序,并且设置mapred.reduce.tasks>1,则sort by 只保证每个reducer的输出有序,不保证全局有序。
- distribute by (字段)根据指定的字段将数据分到不同的reducer,且分发算法是hash散列。
- cluster by(字段)除了具有distribute by 的功能外,还会对该字段进行排序
因此,如果distribute 和sort字段是同一个时,此时,cluster by = distribute by + sort by
常用函数
求总行数(count)
select count() from score;
求分数的最大值(max)
select max() from score;
求分数的最小值(min)
select min() from score;
** 求分数的总和(sum)**
select sum() from score;
求分数的平均值(avg)
select avg(*) from score;
sort by: 每个MapReduce内部进行排序,对全局结果集来说不是排序
设置reduce个数
set mapreduce.job.reduce=3;
查看设置reduce个数
set mapreduce.job.reduces;
查询成绩按成绩降序排序
select * from score sort by s_score;
将查询结果导入到文件中(按照成绩降序排序)
insert overwrite local directory ‘/home/hivedata/sort’ select from score sort by s_score;
分区排序(DISTRIBUTE BY)
Distribute By: 类似MR中partition,进行分区,结合sort by 使用
注意:Hive要求DISTRIBUTE BY 语句要写在SORT BY 语句之前
对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute的效果。
实例操作:先按学生id进行分区,再按照学生成绩进行排序
1.设置reduce的个数,将对应的s_id划分到对应的reduce当中去
set mapreudce.job.reduce=7;
2.通过distribute by 进行数据的分区
insert overwrite local directory ‘/home/qchen/hivedata/sort’ select * from score distribute by s_id sort by s_score;
CLUSTER BY
当distribute by和 sort by字段相同时,可以使用cluster by方式
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是倒序排序,不能指定排序规则为ACS或者DESC。
以下两种写法等价
select * from score cluster by s_id;
select * from score distribute by s_id sort by s_id;