zoukankan      html  css  js  c++  java
  • 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;







  • 相关阅读:
    SqlConnectionStringBuilder
    什么时候使用“静态方法”(转)
    Dos命令下多文件中查找某字符串
    StructLayout(LayoutKind.Sequential)(转)
    DOS批处理高级教程:第四章 批处理中的变量(转)
    DOS批处理高级教程:第一章 批处理基础(转)
    C#各种进制之间数据转换二进制、八进制、十进制、十六进制
    DOS批处理高级教程:第六章 if命令讲解(转)
    ModbusRTU模式和结束符(转)
    DOS批处理高级教程:第七章 DOS批处理编程高级技巧(转)
  • 原文地址:https://www.cnblogs.com/wxk161640207382/p/10830245.html
Copyright © 2011-2022 走看看