Hive安装

1.hive的安装
解压就完事了
配置/etc/profile环境变量
启动hdfs
启动hive
cp $HIVE_HOME/lib/jline.xxxxx $HADOOP_HOME/share/hadoop/yarn/lib
2.show databases;查看数据库
3.show tables;
4.create database xxxxx
5.desc tablename;
6.create table tablename(column columnType....)
tinyInt smallint int bigint String float double array struct map timestamp binary
7.show create table;查看表的详细信息
8.'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 切分的类,在使用这个hdfs中文件的时候,我们要用到这个类进行切分,
一定是在查询数据的时候进行切分的,所以是懒加载的
'org.apache.hadoop.mapred.TextInputFormat'在取hdfs中数据的时候,我们其实是将mr提交完毕以后用mapper进行数据读取的,读取的时候用到的就是textInputFormat
进行的数据读取
 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' mr任务在执行的时候,读取完毕的数据要输出到一个文件中,那么输出的时候只要value不要key
 'hdfs://master:9000/user/hive/warehouse/student'指向的是一个hdfs中的文件夹目录,这个目录中的所有数据都是这个表中的数据
 
9. 默认情况下在我们没有设置这个数据库连接的时候,那么存储的数据位置就在当前的目录中,默认用的derby数据库,那么这个数据库就是hive本地自带的,存储
的位置就在当前目录中
10.如果换了一个启动目录那么对应的信息就不存在了,为了保证数据的持久性,我们将数据存放到一个mysql中
11.安装mysql  rpm -qa|grep mysql
rpm -e --nodeps xxx.mysql.xxxx
rpm -ivh MysqlServer ....
rpm -ivh MysqlClient...
service mysql start
/usr/bin/mysql_secure_installation
进行设置
eg:千万不需要disallow远程用户登陆

12.mysql -uroot -p  -h 使用客户端登陆服务端
13.将mysql数据库中的mysql数据库的user表中的host改为%就可以统配所有的ip地址
grant all privileges on *.* to root@"%" identified by "123456";
flush privileges;
delete from user where host!="%";
service mysql restart;

14.关于mysql的常识
千万别删除元root用户

15.配置数据库的远程连接,创建hive数据库的时候要选择latin1编码格式,如果使用的是navicate这个工具 latin swedish

16.在hive中的所有的数据都存在hdfs中,其实一个表对应的是一个文件夹
/user/hive/warehouse是hive存放文件的基础目录,默认不变直接指向这个目录
这个是根目录,创建的数据库会在这个目录中存在一个叫xxx.db的一个文件夹  创建一个表就会产生一个和表明一样的文件夹
如果想要更换位置 create .... location "hdfs:xx:9000/xxxxx"

17.默认进入到hive中的时候,不需要选择数据库,默认会有一个数据库default
默认进入就是default数据库,这个数据库的目录在/user/hive/warehouse/这个目录中
如果创建的是default数据库中的表,那么这个表的文件夹在/user/hive/warehouse/里面
如果是自己创建的数据库,/user/hive/warehouse/xx.db/文件夹

18.插入数据
stored as textFile我们创建的这个表的数据在hdfs中,那么存储的时候是以文本形式存储的
在hive中是和hdfs保持长连接 dfs -command  和原来的hdfs的命令是一样的

19.hdfs中的分隔符
如果我们不指定分隔符的话,那么默认的分隔符就是^A,如果模板中不指定用什么进行分割,那么hive对一个数据默认会按照^A
进行分割,虽然我们在insert的数据中没有看到但是确实按照^A分割的
create table stu120(id int,name string) row format delimited fields terminated by " ";
20.加载数据
直接将数据放入hdfs的对应的表的路径中
通过hive命令加入数据 load data [local] inpath "本地路径" [overwrite] into table tablename;
如果将一个hdfs中的文件加入到表中,那么这个文件直接被移除掉

21.hive中的DDL关于表的修改
drop table  tableName;删除表
删除的是元数据和表中的数据
内部表我们自己创建的表如果没有指定那么就是internal,内部表的元数据和hdfs中的数据可以一起删除
一般创建的表都是外部表external
创建的表的类型managed_table / external table
外部表在删除的时候只删除元数据,hdfs中的数据不丢失
外部表一般作为共享数据使用

22.DDL
修改表的名字 alter table tablename rename to newName;
修改 表中的字段信息:alter table tablename change column oldColumn newColumn columnType
eg:注意模板的类型,如果和文件映射不对应,那么就不显示这个数据不会报错
添加字段:alter table tablename add columns(column columnType....)
如果模板中的字段太多,那么就会有一部分的列没有数据,但是不会报错
替换字段:alter table tablename replace columns(col colType.....)一次性替换所有的字段,不能单独的替换某个字段

23.DML数据库的sql语句
insert  update delete select
hive本质是一个数据仓库,只是存放数据
前几个版本完全不支持insert,现在支持了,但是我们完全不推荐使用
select column from table where group by having order by limit;
子查询中有 =  in
根据查询语句关键字的顺序进行学习:
t_emp员工表 t_dept部门表
empno                   int                                         
ename                   string                                      
job                     string                                      
salary                  double                                      
bonus                   double                                      
hiredate                string                                      
mgr                     int                                         
deptno                  int

create table t_emp (empno int,ename string,job string,salary double,bonus double,hiredate string,mgr int,deptno int);


INSERT INTO `t_emp` VALUES ('7369', 'zqq', 'CLERK', '7902', '1980-04-08', '800.00', null, '20');
INSERT INTO `t_emp` VALUES ('7499', 'lsz', 'SALESMAN', '7698', '1981-02-20', '1600.00', '300.00', '30');
INSERT INTO `t_emp` VALUES ('7521', 'wxk', 'SALESMAN', '7698', '1981-02-22', '1250.00', '500.00', '30');
INSERT INTO `t_emp` VALUES ('7566', 'zhangsan', 'MANAGER', '7839', '1981-05-05', '2975.00', null, '20');
INSERT INTO `t_emp` VALUES ('7654', 'lisi', 'SALESMAN', '7698', '1981-12-28', '1250.00', '1400.00', '30');
INSERT INTO `t_emp` VALUES ('7698', 'aa', 'MANAGER', '7839', '1981-06-01', '2850.00', null, '30');
INSERT INTO `t_emp` VALUES ('7782', 'bb', 'MANAGER', '7839', '1981-07-09', '2450.00', null, '10');
INSERT INTO `t_emp` VALUES ('7788', 'liudingkun', 'ANALYST', '7566', '1982-10-09', '3000.00', null, '20');
INSERT INTO `t_emp` VALUES ('7839', 'king', 'PRESIDENT', null, '1981-11-17', '5000.00', null, '10');
INSERT INTO `t_emp` VALUES ('7844', 'lw', 'SALESMAN', '7698', '1981-09-08', '1500.00', '0.00', '30');
INSERT INTO `t_emp` VALUES ('7876', 'jjw', 'CLERK', '7788', '1983-04-05', '1100.00', null, '20');
INSERT INTO `t_emp` VALUES ('7900', 'wzw', 'CLERK', '7698', '1981-03-03', '950.00', null, '30');
INSERT INTO `t_emp` VALUES ('7902', 'wjh', 'ANALYST', '7566', '1981-07-03', '3000.00', null, '20');
INSERT INTO `t_emp` VALUES ('7934', 'wangke', 'CLERK', '7782', '1982-06-23', '1300.00', null, '10');
==============================
deptno                  int                                         
dname                   string                                      
location                string
deptno int,danem string,location string
create table t_dept (deptno int,dname string,location string);

INSERT INTO `t_dept` VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO `t_dept` VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO `t_dept` VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO `t_dept` VALUES ('40', 'OPERATIONS', 'BOSTON');
where = != <>  < >  is null  is not null  
都支持

在研发部的人员有谁?
 select * from t_emp e,(select deptno from t_dept where dname="yfabu")t where e.deptno = t.deptno;
我们在使用子查询的时候那么这个键不能用=,我们一般使用join关联来代替

查询每个部门最高的薪资的人?
select e.ename,t.max,t.deptno
from t_emp e,
(select max(salary) max,deptno from t_emp group by deptno)t
where e.salary = t.max and e.deptno = t.deptno
哪个部门的员工大于三个人?
select count(*),deptno from t_emp group by deptno having count(*)>3
哪个部门的平均工资大于5000;
select avg(salary),deptno from t_emp group by deptno having avg(salary)>5000
最高工资的那个人所属的部门有哪些人?
select e1.* from t_emp e1,
(select deptno from t_emp e,(select max(salary) max from t_emp)t where e.salary=t.max)t2
where e1.deptno = t2.deptno
谁的工资比tom的工资高?
select * from t_emp where salary >(select salary from t_emp where ename="tom")
select * from t_emp e,(select salary from t_emp where ename="tom")t where e.salary>t.salary;
在子查询中不能是使用>=<,等值或者不等值连接

全公司最高工资的两个人所在部门的员工名单?
limit 0,2这个写法是mysql   hive中的sql语句写法是limit 2没有从什么位置开始,只有多长
eg:在hdfs中使用命令是dfs -command file;
eg:在hive中使用linux的命令 !command ;
select e.* from
t_emp e,
(select deptno,salary from t_emp order by salary desc limit 2)t
where e.deptno = t.deptno;

tom的下属有哪些人?
select e. * from t_emp e,
(select empno from t_emp where ename="tom")t
where e.mgr=t.empno
========================原理和优化==================================
groupBy分组?会造成一个数据倾斜
1.解决方案:将输入在map端进行部分的打乱重分
set hive.groupby.skewindata=true;
2.在map到reduce端的时候设置combiner进行合并
set hive.map.aggr=true;
3.在combiner进行合并的时候要知道数据量的大小,如果不是特别大就不需要进行合并
set hive.groupby.mapaggr.checkinterval=100000;如果数据小于10w条那么没必要合并
4.看在combiner合并期间做的合并率
set hive.map.aggr.hash.min.reduction=0.5

order by是排序?全局排序,reduce就应该是一个
其实orderby就是一个reduce在进行排序处理,那么压力特别大,并且容易产生宕机
那么我们在使用这个order by的时候就不能进行全局排序,加上limit
set hive.mapred.mode = strict;
在严格模式下如果向使用order by进行排序,那么必须使用limit进行指定条数

sort by排序,不是全局排序,单个reduce的排序
问题:将每个部门的数据都按照工资进行倒序?

set mapreduce.job.reduces=3;
select * from t_emp distribute by deptno sort by salary desc;







posted @ 2019-05-08 10:19  鹦鹉英冠  阅读(149)  评论(0编辑  收藏  举报