一、回顾
    1、hive基于Hadoop的(存储HDFS,计算MR)
    2、sql on hadoop概念
            -》简化开发的操作
            -》提升业务的效率
    3、描述表的三种方式
            desc tb_name;
            desc extended tb_name;
            desc formatted tb_name;
    4、hive默认情况下创建的表,类似都为: MANAGED_TABLE 管理表
    5、函数方法
         show functions;查看系统中的方法
         desc function upper;
         desc function extended upper;
         注意描述一个方法,需要加上function关键词,与描述表进行区分
        
二、hive自定义日志log文件
    1、对hive下的conf目录下的mv hive-log4j.properties.template hive-log4j.properties重命名
    2、修改hive.log.dir=/opt/moduels/hive-0.13.1-bin/logs,指定自定义的log路径
                -》注意先创建,默认是在/tmp/***用户名下

三、hive指定数据库名和列名
    1、修改hive-site.xml文件
    -》指定显示列名
    <property>
      <name>hive.cli.print.header</name>
      <value>true</value>
    </property>
    -》指定显示数据库名
    <property>
      <name>hive.cli.print.current.db</name>
      <value>true</value>
    </property>

四、hive的常用shell参数
    使用bin/hive -help查看参数
    1、指定默认链接的数据库
    $ bin/hive --database hadoop14
    2、在linuxshell命令行执行HQL语句()
    $ bin/hive -e 'show databases'
    $ bin/hive -e 'show databases' > hivetest.txt
    将结果重定向到一个指定的文件中,使用追加或者覆盖符号
    3、在linuxshell命令行执行一个写有sql语句的文件
    $ bin/hive -f /opt/datas/hive.sql
    4、只针对于当前shell生效的更改配置的参数
    $ bin/hive --hiveconf hive.cli.print.current.db=false
    5、查看当前参数的设置的值是什么
    set hive.cli.print.current.db;
    set hive.cli.print.current.db=false;
    同样也可以更改当前参数的值,只针对于当前shell生效

五、hive数据库的常用操作
1、LOCATION指定数据库表的位置
建库:
create database if not exists db01_loc LOCATION '/locate';
建表:
create table db01_loc.tb01(
name string
)row format delimited fields terminated by '\t';

2、
建库:
create database if not exists db02;
删除数据库:
drop database db02;
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
drop database db01_loc CASCADE;
删除非空的数据库

六、hive的表的常用操作

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name    -- (Note: TEMPORARY available in Hive 0.14.0 and later)
  [(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
  [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]
  [SKEWED BY (col_name, col_name, ...)                  -- (Note: Available in Hive 0.10.0 and later)]
     ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [STORED AS DIRECTORIES]
  [
   [ROW FORMAT row_format]
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]   -- (Note: Available in Hive 0.6.0 and later)
  [AS select_statement];   -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)
 
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  LIKE existing_table_or_view_name
  [LOCATION hdfs_path];

表的第一种创建方式:普通创建
create table if not exists stu_info(
num int,
name string
)
row format delimited fields terminated by '\t'
stored as textfile;
load data local inpath '/opt/datas/student.txt' into table stu_info;
清空表的内容,保留了表的结构
truncate table student;

删除表:
drop table if exists student;

create table if not exists student(
num int,
name string
)
row format delimited fields terminated by '\t'
stored as textfile;
从本地加载
load data local inpath '/opt/datas/student.txt' into table student;

从HDFS加载
load data inpath '/student.txt' into table student;

本地加载和HDFS加载的区别,一个本地的复制拷贝,一个是移动数据文件的位置到对应的表目录下

表的第二种创建方式:子查询
create table stu_as as select name from student;
特点:将子查询的结构赋予一张新的表

表的第三种创建方式:like方式
create table stu_like like student;
特点:复制表的结构

建库:
create database if not exists db_emp;

员工表:
create table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
row format delimited fields terminated by '\t'
stored as textfile;
load data local inpath '/opt/datas/emp.txt' into table emp;

load data local inpath '/opt/datas/emp.txt' overwrite into table emp;
先删除数据,后加载数据

部门表:
create table dept(
deptno int,
dname string,
loc string
)
row format delimited fields terminated by '\t'
stored as textfile;
load data local inpath '/opt/datas/dept.txt' into table dept;

七、hive的外部表
    1、EXTERNAL-》外部表,另一种表的类型
    2、举例:
    Web服务器-》生成大量日志文件
                -》20170513.log文件
    情况:多个部门要分析多个不同的指标,建不同的表,但分析的数据源文件只有一份

create table emp1(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
row format delimited fields terminated by '\t'
LOCATION '/user/hive/warehouse/db_emp.db/emp';
load data local inpath '/opt/datas/emp.txt' into table emp;

show tables;->mysql找table
如果没有列出表,说明表的元数据被删除了,然后再删除表的文件夹

创建外部表:
create EXTERNAL table dept_ext(
deptno int,
dname string,
loc string
)
row format delimited fields terminated by '\t'
LOCATION '/user/hive/warehouse/db_emp.db/dept';

管理表删除的时候是删除元数据和表的对应文件夹
外部表删除的时候只删除元数据

首先创建管理表,然后可以创建多个外部表

作用:保证数据的安全性

八、hive中的分区表

举例:

-》先查询再过滤
    WEB服务器,存储日志文件,分析
            -》logs文件夹
                -》20170513.log
                -》20170514.log
                -》20170515.log
                -》20170516.log
    使用hive去分析前一天的数据
    第一种方式:将所有的日志文件放到一个文件夹下,使用一张表进行加载
    在hive输入SQL-》找到元数据-》找到table以及找到HDFS上table对应的文件夹
    -》将文件夹中的数据返回-》封装给MR
    select * from logs where date='20170513';
    
    -》直接加载,hive中的分区概念
    WEB服务器,存储日志文件,分析
            -》logs文件夹
                -》20170513文件夹
                    -》20170513.log
                -》20170514文件夹
                    -》20170514.log
                -》20170515文件夹
                    -》20170515.log
                -》20170516文件夹
                    -》20170516.log
    select * from logs where date='20170513';

创建分区表:分区表的分区是虚拟逻辑的
create table emp_part(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
partitioned by (date string)
row format delimited fields terminated by '\t';

load data local inpath '/opt/datas/emp.txt' into table emp_part partition (date='20170513');
load data local inpath '/opt/datas/emp.txt' into table emp_part partition (date='20170512');

select * from emp_part where date='20170513';

-》logs文件夹
                -》20170513文件夹
                    -》20170513.log
                -》20170514文件夹
                    -》20170514.log
                -》20170515文件夹
                    -》20170515.log
                -》20170516文件夹
                    -》20170516.log

create table emp_part3(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
partitioned by (date string,hour string)
row format delimited fields terminated by '\t';

load data local inpath '/opt/datas/emp.txt' into table emp_part3 partition (date='20170513',hour='10');
load data local inpath '/opt/datas/emp.txt' into table emp_part3 partition (date='20170513',hour='11');

作用:提高查询检索的效率

九、分析函数&窗口函数
    作用:对分组后的数据进行处理
create table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
row format delimited fields terminated by '\t';
load data local inpath '/opt/datas/emp.txt' into table emp;

需求:查看部门10的所有员工,按照薪资进行降序排列,默认情况下是升序的
select * from emp where deptno='10' order by sal desc;

emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        emp.deptno
7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10

需求:按照所有部门进行分组,按照薪资进行降序排列,每个部门薪资最高的那个人显示在最后一列

select empno,ename,deptno,sal,max(sal) over (partition by deptno order by sal desc) as max_as from emp;

(partition by deptno order by sal desc)这部分进行了分组,然后针对每个分组进行排序
如果不使用这种分析函数之类的去分析的话,排序和分组都是全局的

empno   ename   deptno  sal     max_as
7839    KING    10      5000.0  5000.0
7782    CLARK   10      2450.0  5000.0
7934    MILLER  10      1300.0  5000.0

7788    SCOTT   20      3000.0  3000.0
7902    FORD    20      3000.0  3000.0
7566    JONES   20      2975.0  3000.0
7876    ADAMS   20      1100.0  3000.0
7369    SMITH   20      800.0   3000.0

7698    BLAKE   30      2850.0  2850.0
7499    ALLEN   30      1600.0  2850.0
7844    TURNER  30      1500.0  2850.0
7654    MARTIN  30      1250.0  2850.0
7521    WARD    30      1250.0  2850.0
7900    JAMES   30      950.0   2850.0

select empno,ename,deptno,sal,row_number() over (partition by deptno order by sal desc) as rn from emp;

empno   ename   deptno  sal     rn
7839    KING    10      5000.0  1
7782    CLARK   10      2450.0  2
7934    MILLER  10      1300.0  3

7788    SCOTT   20      3000.0  1
7902    FORD    20      3000.0  2
7566    JONES   20      2975.0  3
7876    ADAMS   20      1100.0  4
7369    SMITH   20      800.0   5

7698    BLAKE   30      2850.0  1
7499    ALLEN   30      1600.0  2
7844    TURNER  30      1500.0  3
7654    MARTIN  30      1250.0  4
7521    WARD    30      1250.0  5
7900    JAMES   30      950.0   6

select empno,ename,deptno,sal from (select empno,ename,deptno,sal,row_number() over (partition by deptno order by sal desc) as rn from emp) tmp where rn <3;

empno   ename   deptno  sal
7839    KING    10      5000.0
7782    CLARK   10      2450.0

7788    SCOTT   20      3000.0
7902    FORD    20      3000.0

7698    BLAKE   30      2850.0
7499    ALLEN   30      1600.0

LEAD向后和LAG向前 (列、偏移量、默认值)

id        name        lag(name,1,0)
1        jack        0
2        tom            0

十、hive的数据导入方式
    1、load方式,本地
    load data local inpath 'local_path' into table tb_name;
        从本地复制了文件到表的路径下
        应用场景:大部分的使用,文件几乎都是默认现在本地的
    2、load方式,HDFS
    load data inpath 'hdfs_path' into table tb_name;
    将文件移动到了表的路径下
        应用场景:更适合大数据量的存储
    3、load方式,overwrite
    load data inpath 'hdfs_path' overwrite into table tb_name;
        应用场景:适合一些重复写入的表(临时表),作为一个过渡使用
    4、子查询方式,as
        应用场景:对于数据查询结果的保存
    5、insert方式
        传统关系型数据库中,insert是插入一个值
        在hive中insert into table后面还是跟一个语句(select语句)
    insert into table select sql;
    举例:
create table emp_insert like emp;

insert into table emp_insert select * from emp;
        应用场景:和子查询类似
    
    6、location
        指定一个文件夹,然后将数据导入进去

十一、hive数据的导出
    1、insert方式
    格式:insert overwrite [local] directory 'path' select sql;
    数据导出到本地
    insert overwrite local directory '/opt/datas/emp_in01' select * from emp;
    -》输出的目标可以提前存在,底层实现的时候,先删除再重新创建
    -》指定分隔符
    insert overwrite local directory '/opt/datas/emp_in01' row format delimited fields terminated by '\t' select * from emp;
    -》HDFS
    insert overwrite directory '/emp_insert' select * from emp;
    -》注意:上一级的父目录必须存在
    2、HDFS SHELL命令 -get
    bin/hdfs dfs -get hdfs_path local_path
    3、在Linux的命令行使用hive的-e -f参数,将输出重定向保存到本地文件
    4、sqoop方式
    5、hive支持export和import
    -》export
    export table tb_name to 'hdfs_path'
    -》import
    import table tb_name from 'hdfs_path'

十二、hive的常用HQL语句
    1、过滤条件
        where 、limit、 distinct、 between and 、 null、 is not null
select * from emp where sal > 3000;
select * from emp limit 1;
select distinct deptno from emp;   
select * from emp where sal between 2000 and 3000;
select ename from emp where comm is null;
select ename from emp where comm is not null;

2、聚合函数
    count、 sum、 avg、 max、 min 、group by、 having

select count(1) from emp;
select count(*) from emp;  -》运行效率较低

select avg(sal) avg_sal from emp;
select deptno,avg(sal) from emp group by deptno;
select deptno,avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;

3、join
        等值join
        左join  left
        右join    right
        全join    full

A表:
    ID        NAME
    1        张三
    2        李四
    3        王五
    5        赵六
B表:
    ID        phone
    1        1111
    2        2222
    3        3333
    4        4444

select e.empno,e.ename,d.deptno,e.sal from emp e join dept d on e.deptno=d.deptno;

select e.empno,e.ename,d.deptno,e.sal from emp e left join dept d on e.deptno=d.deptno;

select e.empno,e.ename,d.deptno,e.sal from emp e right join dept d on e.deptno=d.deptno;

select e.empno,e.ename,d.deptno,e.sal from emp e full join dept d on e.deptno=d.deptno;

十三、hive与MR的常用参数设置

设置每个reduce处理的数据量
  set hive.exec.reducers.bytes.per.reducer=<number>
 
  <property>
  <name>hive.exec.reducers.bytes.per.reducer</name>
  <value>1000000000</value>
  <description>size per reducer.The default is 1G, i.e if the input size is 10G, it will use 10 reducers.</description>
</property>

设置最大能够运行的reduce个数
  set hive.exec.reducers.max=<number>
 
  <property>
  <name>hive.exec.reducers.max</name>
  <value>999</value>
  <description>max number of reducers will be used. If the one
    specified in the configuration parameter mapred.reduce.tasks is
    negative, Hive will use this one as the max number of reducers when
    automatically determine number of reducers.</description>
</property>

实际reduce的个数
  set mapreduce.job.reduces=<number>

<property>
  <name>mapreduce.job.reduces</name>
  <value>1</value>
  <description>The default number of reduce tasks per job. Typically set to 99%
  of the cluster's reduce capacity, so that if a node fails the reduces can
  still be executed in a single wave.
  Ignored when mapreduce.jobtracker.address is "local".
  </description>
</property>

十四、hive中的几种排序方式
    1、order by
    select * from emp order by sal;
    2、sort by

insert overwrite local directory '/opt/datas/emp_sort' row format delimited fields terminated by '\t' select * from emp sort by sal;

3、distribute by
    
insert overwrite local directory '/opt/datas/emp_dist' row format delimited fields terminated by '\t' select * from emp distribute by deptno sort by sal;

4、cluster by
        =distribute by+sort by

insert overwrite local directory '/opt/datas/emp_cls' row format delimited fields terminated by '\t' select * from emp cluster by sal;

十五、UDF函数
    1、【需求】实现大小写转换
    2、在pom.xml文件中添加hive的相关依赖,重新update工程即可
       <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>0.13.1</version>
        </dependency>

<dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>0.13.1</version>
        </dependency>
    3、将自己的hive-site.xml文件放到eclipse工程下,便于读取配置
    4、继承UDF类,import org.apache.hadoop.hive.ql.exec.UDF;
    5、写完程序,打jar包上传到Linux系统中
    6、与jar包进行关联
        add jar /opt/datas/udf.jar;
    7、创建function函数方法
create temporary function my_udf as 'com.bigdata.mapreduce.BigdataUdf';
    8、执行将emp表中的ename全部转换成小写
    select ename,my_udf(ename) low_ename from emp;

hive新手学习随笔的更多相关文章

  1. Hive入门学习随笔(一)

    Hive入门学习随笔(一) ===什么是Hive? 它可以来保存我们的数据,Hive的数据仓库与传统意义上的数据仓库还有区别. Hive跟传统方式是不一样的,Hive是建立在Hadoop HDFS基础 ...

  2. Hive入门学习随笔(二)

    ====使用Load语句执行数据的导入 --将操作系统上的文件student01.txt数据导入到t2表中 load data local inpath '/root/data/student01.t ...

  3. 新手学习web遇到的一些乱码问题

    在新手学习web网站学习的时候经常会遇到?????这种乱码,对于刚起步的菜鸟来说真的很头痛,很容易打击继续学的信心当然了对于菜鸟的我最近也遇到过乱码问题,沉浸其中不能自拔,爱的深啊!!!!!我所遇到的 ...

  4. ReactNative新手学习之路07ListView_ renderHeader使用StaticContainer

    react native新手学习之路07ListView_ renderHeader使用StaticContainer 1.某些特殊场景需要用ScrollView滚动和ListView配合但是不幸运的 ...

  5. ReactNative新手学习之路01-创建项目开始

    新手学习之路01-创建项目开始 小菜鸟准备学习RN开发,决定写下自己的学习历程,方便其他也想要学习RN的人,后期会持续更新写下自己所有学习经历,一步步从菜鸟成长成业内高手.开发环境准备,本文默认环境已 ...

  6. (转) 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

    特别棒的一篇文章,仍不住转一下,留着以后需要时阅读 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

  7. Python新手学习基础之初识python——与众不同2

    看完了Python的缩进,现在来看看Python的标识符.引号和注释. 标识符 关于Python的标识符,其实不是与众不同,只是有一定的规则. 标识符是编程时使用的名字.在Python中,标识符有几点 ...

  8. 新手学习.net编程计划-1

    .NET是一个庞大的学习体系,对于新手来说会感觉无从下手.学习知识必须从入门的基础学起,才能更好地掌握.学习.net也是如此,最基础的莫过于了解.net平台,以及掌握.net的基础语法C#. 本计划是 ...

  9. 爬虫新手学习2-爬虫进阶(urllib和urllib2 的区别、url转码、爬虫GET提交实例、批量爬取贴吧数据、fidder软件安装、有道翻译POST实例、豆瓣ajax数据获取)

    1.urllib和urllib2区别实例 urllib和urllib2都是接受URL请求相关模块,但是提供了不同的功能,两个最显著的不同如下: urllib可以接受URL,不能创建设置headers的 ...

随机推荐

  1. Python学习---socketServer编程

    学会去看源码 服务器端: import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): ...

  2. IEEP-OSPF域内路由故障-现象与排障思路

    OSPF域内路由故障-现象与排障思路 一.故障现象 OSPF的或内路由故障常表现为邻居路由器不通告部分或全部路由,可能的原因通常为: 1).拟通告的接口上未启用OSPF 2).拟通告的接口被关闭 OS ...

  3. 高质量C++C编程指南笔记 标签: c++笔记 2015-11-22 20:59 179人阅读 评论(0) 收藏

    1.  在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数. 2.  如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面 ...

  4. tree结构统一修改属性名(递归)

    1 //data为需要修改的tree,这里主要是为antd design 里面select规范数据 const ass = (data) => { let item = []; data.map ...

  5. 【Z】扩展阿里巴巴Java开发规约插件

    https://blog.csdn.net/u014513883/article/details/79186893 1.前言 工作中难免会遇到维护别人代码的情况,那么首先就得看懂别人写的代码.如果对方 ...

  6. tftp传输可执行程序问题

    昨天搭建了板子从nfs系统启动,这样只要在开发机上编写程序编译,就可以在板子上测试运行了,编写了hello world 程序,用arm编译器编译,在主板上运行,提示出错:什么exception ((什 ...

  7. apache log4j-1.2.15的使用

    1.这个log4j的下载 下载 http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.15/apache-log4j-1.2.15.zip 2. ...

  8. BIND简易教程(0):在Ubuntu下源码安装BIND(其实跟前面的教程没太大关系)

    之前介绍过BIND的基本使用啦.关于BIND的入门级使用方法见:http://www.cnblogs.com/anpengapple/p/5877661.html简易教程系列,本篇只讲BIND安装. ...

  9. UVa 10791 - Minimum Sum LCM(唯一分解定理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  10. js 实现加入收藏/加入首页功能

    加入收藏夹实现: html代码如下: <a href="javascript:;" onclick="AddFavorite(window.location.hre ...