hive> show databases;
hive> show tables;
hive> create table test (id int);
hive> insert into test values(1);
hive> select * from test;
4. Hive的数据类型
4.1 Hive基本的数据类型
4.2 集合数据类型
5. DDL数据定义
5.1 数据库操作
# 其中if not表示创建XXX表的时候如果已经存在就不执行该命令
# location表示将库创建到指定的目录下边
create database if not exists XXX location '/XXX';
# 查询所有数据库
show databases;
# like参数代表查找以XXX开头的
show databases like 'XXX*';
# 查询当前数据库的详细信息
desc database XXX;
# 切换数据库
use XXX;
# 修改数据库
alter database XXX set dfproperties("XXX":"XXX")
# 删除数据库,只能删除空的库
drop database XXX;
# 如果不为空但是想要删除使用
drop database XXX cascade;
5.2 建表语法
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]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]
5.2.1 字段解释说明
(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
create table if not exists student2(
id int, name string
)
row format delimited fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/student2';
(2)根据查询结果创建表(查询的结果会添加到新创建的表中)
create table if not exists student3 as select id, name from student;
bin/hive -e 'select * from default.student;' >/opt/module/hive/data/export/student4.txt;
6.4 清空表
# 只能清空内部表
truncate table student;
7. 查询
7.1 基本查询
(0)原始数据
dept.txt:
10 ACCOUNTING 1700
20 RESEARCH 1800
30 SALES 1900
40 OPERATIONS 1700
emp.txt:
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
(1)创建部门表
create table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';
(2)创建员工表
create table if not exists emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
(3)导入数据
load data local inpath '/opt/module/datas/dept.txt' into table dept;
load data local inpath '/opt/module/datas/emp.txt' into table emp;
7.1.1 全表查询
select * from emp;
7.1.2 特定列查询
select empno, ename from emp;
# 也可以为列取别名,取别名的时候,用不用AS都可以。
select ename AS name, deptno dn from emp;
注意SQL对大小写不敏感,SQL尽量不要写Tab缩进。关键字不能分行写。
7.1.3 算术运算符
# 实现所有源共的薪水 +1 显示
select ename sal + 1000 from emp;
7.1.4 常用函数
# 求总行数(count)
hive (default)> select count(*) from emp;
# 求工资的最大值(max)
hive (default)> select max(sal) from emp;
# 求工资的最小值(min)
hive (default)> select min(sal) from emp;
# 求工资的总和(sum)
hive (default)> select sum(sal) from emp;
# 求工资的平均值(avg)
hive (default)> select avg(sal) from emp;
7.1.5 Limit语句
# 限制输出的行数
select * from emp limit 2;
7.1.6 where语句
# 查看工资大于1000的
select * from emp where sal > 1000;
# 查询出薪水等于 5000 的所有员工
select * from emp where sal =5000;
# 查询工资在 500 到 1000 的员工信息
select * from emp where sal between 500 and 1000;
# 查询 comm 为空的所有员工信息
select * from emp where comm is null;
# 查询工资是 1500 或 5000 的员工信息
select * from emp where sal IN (1500, 5000);
# 查找名字以 A 开头的员工信息
select * from emp where ename LIKE 'A%';
# 查找名字中第二个字母为 A 的员工信息
select * from emp where ename LIKE '_A%';
# 查找名字中带有 A 的员工信息
select * from emp where ename RLIKE '[A]';
7.1.7 逻辑运算符
# 查询薪水大于 1000,部门是 30
select * from emp where sal>1000 and deptno=30;
# 查询薪水大于 1000,或者部门是 30
select * from emp where sal>1000 or deptno=30;
# 查询除了 20 部门和 30 部门以外的员工信息
select * from emp where deptno not IN(30, 20)
7.2 聚合函数Group By
GROUP BY 语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。
# 计算 emp 表每个部门的平均工资
select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;
# 计算 emp 每个部门中每个岗位的最高薪水
select t.deptno, t.job, max(t.sal) max_sal from emp t group by t.deptno, t.job;
7.2.1 Having语句
(1)where 后面不能写分组函数,而 having 后面可以使用分组函数。
(2)having 只用于 group by 分组统计语句。
# 求每个部门的平均薪水大于 2000 的部门
# 求每个部门的平均工资
select deptno, avg(sal) from emp group by deptno;
# 求每个部门的平均薪水大于 2000 的部门
select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
# 上述语句等同于where:
select deptno, avg_sal from (select deptno, avg(sal) avg_sal from emp group by deptno)t1 where avg_sal > 2000;
# 建议还是使用having好了!