hive新手学习随笔
一、回顾
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新手学习随笔的更多相关文章
- Hive入门学习随笔(一)
Hive入门学习随笔(一) ===什么是Hive? 它可以来保存我们的数据,Hive的数据仓库与传统意义上的数据仓库还有区别. Hive跟传统方式是不一样的,Hive是建立在Hadoop HDFS基础 ...
- Hive入门学习随笔(二)
====使用Load语句执行数据的导入 --将操作系统上的文件student01.txt数据导入到t2表中 load data local inpath '/root/data/student01.t ...
- 新手学习web遇到的一些乱码问题
在新手学习web网站学习的时候经常会遇到?????这种乱码,对于刚起步的菜鸟来说真的很头痛,很容易打击继续学的信心当然了对于菜鸟的我最近也遇到过乱码问题,沉浸其中不能自拔,爱的深啊!!!!!我所遇到的 ...
- ReactNative新手学习之路07ListView_ renderHeader使用StaticContainer
react native新手学习之路07ListView_ renderHeader使用StaticContainer 1.某些特殊场景需要用ScrollView滚动和ListView配合但是不幸运的 ...
- ReactNative新手学习之路01-创建项目开始
新手学习之路01-创建项目开始 小菜鸟准备学习RN开发,决定写下自己的学习历程,方便其他也想要学习RN的人,后期会持续更新写下自己所有学习经历,一步步从菜鸟成长成业内高手.开发环境准备,本文默认环境已 ...
- (转) 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ
特别棒的一篇文章,仍不住转一下,留着以后需要时阅读 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ
- Python新手学习基础之初识python——与众不同2
看完了Python的缩进,现在来看看Python的标识符.引号和注释. 标识符 关于Python的标识符,其实不是与众不同,只是有一定的规则. 标识符是编程时使用的名字.在Python中,标识符有几点 ...
- 新手学习.net编程计划-1
.NET是一个庞大的学习体系,对于新手来说会感觉无从下手.学习知识必须从入门的基础学起,才能更好地掌握.学习.net也是如此,最基础的莫过于了解.net平台,以及掌握.net的基础语法C#. 本计划是 ...
- 爬虫新手学习2-爬虫进阶(urllib和urllib2 的区别、url转码、爬虫GET提交实例、批量爬取贴吧数据、fidder软件安装、有道翻译POST实例、豆瓣ajax数据获取)
1.urllib和urllib2区别实例 urllib和urllib2都是接受URL请求相关模块,但是提供了不同的功能,两个最显著的不同如下: urllib可以接受URL,不能创建设置headers的 ...
随机推荐
- Python学习---socketServer编程
学会去看源码 服务器端: import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): ...
- IEEP-OSPF域内路由故障-现象与排障思路
OSPF域内路由故障-现象与排障思路 一.故障现象 OSPF的或内路由故障常表现为邻居路由器不通告部分或全部路由,可能的原因通常为: 1).拟通告的接口上未启用OSPF 2).拟通告的接口被关闭 OS ...
- 高质量C++C编程指南笔记 标签: c++笔记 2015-11-22 20:59 179人阅读 评论(0) 收藏
1. 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数. 2. 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面 ...
- tree结构统一修改属性名(递归)
1 //data为需要修改的tree,这里主要是为antd design 里面select规范数据 const ass = (data) => { let item = []; data.map ...
- 【Z】扩展阿里巴巴Java开发规约插件
https://blog.csdn.net/u014513883/article/details/79186893 1.前言 工作中难免会遇到维护别人代码的情况,那么首先就得看懂别人写的代码.如果对方 ...
- tftp传输可执行程序问题
昨天搭建了板子从nfs系统启动,这样只要在开发机上编写程序编译,就可以在板子上测试运行了,编写了hello world 程序,用arm编译器编译,在主板上运行,提示出错:什么exception ((什 ...
- 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. ...
- BIND简易教程(0):在Ubuntu下源码安装BIND(其实跟前面的教程没太大关系)
之前介绍过BIND的基本使用啦.关于BIND的入门级使用方法见:http://www.cnblogs.com/anpengapple/p/5877661.html简易教程系列,本篇只讲BIND安装. ...
- UVa 10791 - Minimum Sum LCM(唯一分解定理)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- js 实现加入收藏/加入首页功能
加入收藏夹实现: html代码如下: <a href="javascript:;" onclick="AddFavorite(window.location.hre ...