前置:软件:
1、hadoop-2.6.0-cdh5.7.0
2、jdk1.7.0_45
3、hive-1.1.0-cdh5.7.0
hive启动前需要启动hdfs,jps三个进程要起来NN、SNN、DN。
原先部署了集群,在集群中启动hive总是报错,于是自己另开了一台虚拟机部署,部署完成后还遇到一个问题:
hdfs部署完成后,jps查看三个进程都已经启动,但是webui界面进不去,jps查看进程namenode进程消失,再jps进程查看DataNode进程消失,secondaryNameNode进程消失;使用stop-dfs.sh关闭进程,start-dfs.sh重新启动进程后进程仍然会一个个消失,不知道为什么?hive理所当然启动失败。
莫名其妙的关机后重新启动进程jps查看三个进程又都在了,此时hive理所当然的能进入了;这次一起了解下hive语句。
[[email protected] hive]$ hive
which: no hbase in (/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/bin:/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/sbin:/home/hadoop/app/zookeeper/bin:/usr/java/jdk1.8.0_45/bin:/home/hadoop/app/hive/bin:/home/hadoop/app/zookeeper/bin:/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/bin:/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/sbin:/home/hadoop/app/hive/bin:/usr/java/jdk1.7.0_45/bin:/usr/java/jdk1.7.0_45/jre/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin)
Logging initialized using configuration in jar:file:/home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/hive-common-1.1.0-cdh5.7.0.jar!/hive-log4j.properties
WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
hive> show databases;
OK
default
Time taken: 1.375 seconds, Fetched: 1 row(s)
DML:在hive中大部分加载数据都是采用load方式,实际就是加载到hdfs上,因为meta信息已经有了。
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION]
解释:local 指的是本地路径,有local默认是本地linux,没有带local是在hdfs上;overwrite指的是表内容是否覆盖。
1、在本地路径:/home/hadoop/data 下vi一个dept.txt
[[email protected] data]$ pwd
/home/hadoop/data
[[email protected] data]$ cat dept.txt
10 accouting newwork
20 restart china
30 sales japan
## 此时在hive中创建一张表:
create table dept(
deptno string,
dname string,
location string
)row format delimited fields terminated by '\t';
此时创建完成,此表为空表。
## **2、加载表至此表**
LOAD DATA LOCAL INPATH '/home/hadoop/data/dept.txt' OVERWRITE INTO TABLE dept; HIVE中进行如下操作:
hive> create table dept(
> deptno int,
> dname string,
> location string
> )row format delimited fields terminated by '\t';
OK
Time taken: 0.951 seconds
hive> show tables;
OK
dept
Time taken: 0.046 seconds, Fetched: 1 row(s)
hive> load data local inpath '/home/hadoop/data/dept.txt' overwrite into table dept;
Loading data to table g6.dept
[Warning] could not update stats.
OK
Time taken: 25.649 seconds
hive> select * from dept;
OK
10 accouting newwork
20 restart china
30 sales japan
Time taken: 0.545 seconds, Fetched: 3 row(s)
## 3、测试有无overwrite的区别(追加和覆盖)
hive> load data local inpath '/home/hadoop/data/dept.txt' into table dept;
hive> select * from dept;
OK
10 accouting newwork
20 restart china
30 sales japan
10 accouting newwork
20 restart china
30 sales japan
Time taken: 0.087 seconds, Fetched: 6 row(s)
## 4、目前使用的是local,假设我们不使用local
[[email protected] data]$ hadoop fs -mkdir -p /hive/dept
[[email protected] data]$ hadoop fs -put dept.txt /hive/dept/
[[email protected] data]$ hadoop fs -ls /hive/dept
Found 1 items
-rw-r--r-- 1 hadoop supergroup 53 2019-04-18 23:59 /hive/dept/dept.txt
[[email protected] data]$ hadoop fs -ls /hive/dept
该文件为空。
load data inpath '/hive/data/sept.txt' overwrite into table dept;
上述load操作相当于是把这个数据移走了。
注意:'/hive/data/sept.txt' 这个hdfs路径要写清楚。
**内部表与外部表区别?**
## 5、insert
INSERT OVERWRITE LOCAL DIRECTORY '/home/hadoop/tmp/d6/'
row format delimited fields terminated by ','
select deptno,dname from dept;
相等于 = create table xxx as select deptno,dname from dept;
> [[email protected] d6]$ pwd
/home/hadoop/tmp/d6
[[email protected] d6]$ ll
total 4
-rw-r--r--. 1 hadoop hadoop 33 Apr 19 00:25 000000_0
[ha[email protected] d6]$ cat 000000_0
10,accouting
20,restart
30,sales
insert是在hive0.14版本之后是支持的,生产举例:insert数据,1minute几百G数据,插入会产生很多小文件,需要保证每一次数据处理的幂等性(不管跑多少次都要保证结果为真);insert的前提肯定是没有的数据才需要insert。
大数据忌讳:像webUI界面一样,点击按钮去跑MapReduce作业,要看数据量以及资源量
**穿插面试题:hive支不支持insert**
hive中delete删除数据,是不是要去找这个数据在哪再去删除,所以性能是非常低的。
## 6、hive -e
hive -e "select * from dept;" 联想到脚本
#!/bin/bash
hive -e "use g6;select * from dept" 选择数据库密码
./a.sh 会执行这个SQL
## 7、hive -f
vi test.sql
use g6;
select * from dept limit 3; 这是一个脚本
执行结果如下:
[[email protected] d6]$ ll
total 12
-rw-r--r--. 1 hadoop hadoop 33 Apr 19 00:25 000000_0
-rwxrwxr-x. 1 hadoop hadoop 49 Apr 19 00:47 a.sh
-rw-rw-r--. 1 hadoop hadoop 35 Apr 19 00:54 test.sql
[[email protected] d6]$ pwd
/home/hadoop/tmp/d6
[[email protected] d6]$ hive -f test.sql
Logging initialized using configuration in jar:file:/home/hadoop/app/hive-1.1.0-cdh5.7.0/lib/hive-common-1.1.0-cdh5.7.0.jar!/hive-log4j.properties
OK
Time taken: 0.699 seconds
OK
10 accouting newwork
20 restart china
30 sales japan
Time taken: 0.955 seconds, Fetched: 3 row(s)
## 8、hive界面下的清屏操作:!clear; + 回车
总结:
where、>、<、=、limit、between也是支持的between XXX and XXX、
*select * from dept limit 5;
*select * from sal between 800 and 1500;
select * from emp where Ename in (‘SMITH’,‘WARD’);
in、测试的时候发现字段名大小写做了转换
大小写做了转换去元数据中查看,进入到mysql,columns_v2查看表字段都是小写;
1、mysql -uroot -p 进入数据库
2、use ruoze_g6;这个创建的数据库:问?还记得这个数据库是在哪儿创建的么,路径:/home/hadoop/app/hive/conf 下的hive-site.xml文件进行编辑。
3、show tables;
4、select * from tbls \G; 查看所有表格信息,根据表的id去找字段
5、select * from COLUMNS_V2 limit 5; 所有的列的表。判定肯定把Ename转换为小写了;
如果列名错误的话他会提示找不到字段报错。具体展示如下几张图:
6、select ename from emp where sal is null;
1. 作业:在hive中null、0、" "、’ '的区别,如何处理?
二、SQL基本语法
聚合函数:max min sum count avg 多进一出
1、需求:统计这张表中最高工资、最低工资、工资总和、工资数、平均工资
select max(sal),min(sal),sum(sal),count(sal),avg(sal) from emp;
全局整张表
2、需求:求每个部门的平均工资
拿到每个部门的数据、在拿到每个部门数据的基础上求平均工资
select deptno,avg(sal) from emp group by depno;
注意点:出现在groupby中的字段,要么出现在group by中,要么出现在聚合函数中;
groupby前后只能对应一个字段。
3、需求:每个部门下平均薪资>2000的
select empno,avg(sal) avg_sal from emp group by emp where avg_sal > 1000; 此段是错误的
注意使用group by配合having 使用,正确如下:
3.1、select empno,avg(sal) avg_sal from emp group by emp having avg_sal > 1000;
4、case when then 在报表系统中比较常用,
需求:薪资在某个区间输出高或低,
select ename,sal,
case
when sal >1 and sal <1000 then ‘lower’
when sal >=1000 and sal <2000 then ‘middle’
when sal >=2000 and sal <7000 then ‘high’
else ‘highest’ end
from emp;
三、常用函数
built-in 内置
upper lower
operators and UDFs(user-defined functions)
built-in functions
hive > show functions 展示出来所有函数
desc function abs; 查看abs函数的信息。
desc function extended abs;查看ABS函数的详细信息,包括有案例。
绝对值函数:
hive> select abs(-20) from math;
OK
20
Time taken: 2.171 seconds, Fetched: 1 row(s)
hive> desc function extended abs;
OK
abs(x) - returns the absolute value of x
Example:
> SELECT abs(0) FROM src LIMIT 1;
0
> SELECT abs(-5) FROM src LIMIT 1;
5
Time taken: 0.019 seconds, Fetched: 6 row(s)
大小写、时间函数:
select ename,lower(ename) from emp;
1、时间函数:
select current_date from emp;获取当前时间精确到天数
select current_timestamp from emp;精确到秒
select unix_timestamp() from emp;获取的是时间戳
1555624166–>2019-04-19 05:49:26
2、将时间转换为时间戳形式:
select unix_timestamp(“2019-04-19 05:49:26”) from emp;
1555624166
3、另外一种时间格式:yyyyMMddHHmmss
select unix_timestamp(“20190419054926”,“yyyyMMddHHmmss”) from emp;
1555624166
4、获取到"2019-04-19 05:49:26"这个信息中的年、月、日、时、分、秒
select month(“2019-04-19 05:49:26”)from emp;
year–>month–>day–>hour–>minute–>second。
5、date add函数:
select date_add(“2019-04-19 05:49:26”,10) from emp;
20190429
6、select substr(“abcdefg”,2) from emp;
bcdefg 位置是从1开始,2就是从第二位开始。
select substr(“abcdefg”,2,3) from emp;
bcd 位置是从b开始往后3位。
7、select concat(“ab”,“cd”,“fg”) from emp; 把这些字符合在一起。
abcdfg
8、把字符分割开:
select concat_ws("---------",“tree”,“17”) from emp;
9、select “192.168.1.1” from emp;
假设手机点击新闻,后台产生一条日志:ip+port
desc function extended split;
select split(“192.168.1.1:8020,”"\.") from emp;
经典面试题:hive的行转列、列转行
create table hive(sentence string); 创建hive表
load data local inpath ‘/home/hadoop/data/wc.txt’ into table hive; 把wc.txt文件加载入表。
1、select split(sentence,"\t")from hive;
2、select explode(split(sentence,"\t")) from hive;结果如下:
3、需求:统计这些词出现的个数。
hive完成wc,截、行转列、sql
select word,count(1) as c
from
(select explode(split(sentence,"\t")) as word from hive) t
group by word
order by c desc;