一、Hive简介

1、hive概述
Apache Hive™数据仓库软件有助于使用SQL读取,编写和管理驻留在分布式存储中的大型数据集。
可以将结构投影到已存储的数据中。提供了命令行工具和JDBC驱动程序以将用户连接到Hive。
数据计算:mapreduce分布式计算­>难度大
hive­>SQL语句 mysql 简化开发 减少学习成本
2、优缺点
优点:
(1)操作接口采用了sql,简化开发,减少学习成本
(2)避免手写mapreduce程序
(3)hive执行延迟较高,适用场景大多用在对实时性要求不强的情景
(4)优点在于处理大数据
(5)支持自定义函数
缺点:
(1)hive的sql表达能力有限(HSQl)
(2)hive效率低(粒度比较粗,调优较难)
3、hive架构
提供了一系列接口:hive shell、jdbc/odbc、webui

Hive架构

二、Hive安装

1、Hive安装
1)下载安装包
http://hive.apache.org/downloads.html
2)上传安装包
alt+p
3) 解压
tar -zxvf apache-hive-1.2.2-bin.tar.gz -C hd/
4) 解压后的包重命名
mv apache-hive-1.2.2-bin/ hive
5) 修改配置文件
mv hive-env.sh.template hive-enc.sh
vi hive-env.sh
HADOOP_HOME=/root/hd/hadoop-2.8.4
export HIVE_CONF_DIR=/root/hd/hive/conf
6) 启动hive前启动hadoop集群
start-dfs.sh
start-yarn.sh
# start-all.sh # 不建议使用
7) 在hdfs上创建文件夹
hdfs dfs -mkdir /tmp
hdfs dfs -mkdir -p /user/hive/warehouse/
8) 启动hive
bin/hive 2、hive测试
1)查看数据库
show databases;
2) 使用数据库
use default;
3) 查看表
show tables;
4) 创建表
create table student(id int,name string);
5)插入数据
insert into student values(1,"tom");
6) 查询
select * from student;
7) 删除表
drop table student;
8) 退出终端
quit; 3、SecureCRT使用hive命令行不能回退
选择工具栏中的【选项(O)】-【会话选项】-【终端】-【仿真】-【终端】,
下拉选项选择【Linux】,【确定】即可。
这样修改完在hive命令行中输入命令就可以自由增删改了。 4、操作数据
1)准备数据
vi student.txt
1 tom
2 zhangsan
3 lisi
4 zhangsanfeng
5 xiexiaofeng
2)创建hive表
create table student(id int,name string) row format delimited fields terminated by "\t";
3)加载数据
load data local inpath '/root/student.txt' into table student;

三、Hive数据类型

1、配置hive元数据到mysql
1)驱动拷贝
拷贝mysql­-connector-­java­-5.1.39-­bin.jar到/root/hd/hive/lib/下
2)配置Metastore到MySql
在/root/hd/hive/conf目录下创建一个hive-site.xml
根据官方文档配置参数,拷贝数据到hive-site.xml文件中(hive/conf/下创建文件)
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hd09-1:3306/metastore?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
</configuration> 2、hive数据类型
Java数据类型 Hive数据类型 长度
byte TINYINT 1byte
short SMALINT 2byte
int INT 4byte
long BIGINT 8byte
float FLOAT 单精度浮点数
double DOUBLE 双精度浮点数
string STRING 字符
TIMESTAMP 时间类型
BINARY 字节数组 3.DDL数据定义
1)创建数据库
查看数据库
show databases;
创建数据库
create database hive_db;
创建数据库标准写法
create database if not exist db_hive;
创建数据库指定所在hdfs路径
create database hive_db1 location '/hive_db';
2)修改数据库
查看数据库结构
desc database hive-db;
添加描述信息
alter database hive_db set dbproperties('datais'='tom');
查看拓展属性
desc database extended hive_db;
3)查询数据库
显示数据库
show databases;
筛选查询的数据库
show database like 'db*';
4)删除数据库
删除数据库
drop dabase hive_db;
删除数据库标准写法
drop database if exists hive_db;
5)创建表
创建表
> create table db_h(id int,name string)
> row format
> delimited fields
> terminated by "\t";
6)管理表(内部表)
不擅长做数据共享
删除hive中管理表,数据删除。
加载数据
load data local inpath '/root/user.txt' into table emp;
查询并保存到一张新的表
create table if not exists emp2 as select * from emp where name = 'tom';
查询表结构
desc formatted emp;
Table Type: MANAGED_TABLE
7)外部表
hive不认为这张表拥有这份数据,删除该表,数据不删除。
擅长做数据共享
创建外部表
> create external table if not exists emptable(empno int,ename string,job
string,mgr int,birthdate string,sal double,comm double,deptno int)
> row format
> delimited fields
> terminated by '\t';
导入数据
load data local inpath '/root/emp.txt' into table emptable;
查看表结构
desc formatted emptable;
Table Type: EXTERNAL_TABLE
删除表
drop table emptable;
提示:再次创建相同的表 字段相同 将自动关联数据!

附件1:数据员工表 emp.txt

2369    SMITH    CLERK    2902    1980-12-17    800.00        20
2499 ALLEN SALESMAN 2698 1981-2-20 1600.00 300.00 30
2521 WARD SALESMAN 2698 1981-2-22 1250.00 500.00 30
2566 JONES MANAGER 2839 1981-4-2 2975.00 20
2654 MARTIN SALESMAN 2698 1981-9-28 1250.00 1400.00 30
2698 BLAKE MANAGER 2839 1981-5-1 2850.00 30
2782 CLARK MANAGER 2839 1981-6-9 2450.00 10
2788 SCOTT ANALYST 2566 1987-4-19 3000.00 20
2834 KING PRESIDENT 1981-11-17 5000.00 10
2844 TURNER SALESMAN 2698 1981-9-8 1500.00 0.00 30
2976 ADAMS CLERK 2788 1987-5-23 1100.00 20
2900 JAMES CLERK 2698 1981-12-3 950.00 30
2902 FORD ANALYST 2566 1981-12-3 3000.00 20
2924 MILLER CLERK 2782 1982-1-23 1300.00 10

四、DML数据操作

一、分区表
1、创建分区表
hive> create table dept_partitions(depno int,dept string,loc string)
partitioned by(day string)
row format delimited fields
terminated by '\t'; 2、加载数据
load data local inpath '/root/dept.txt' into table dept_partitions;
注意:不能直接导入需要指定分区
load data local inpath '/root/dept.txt' into table dept_partitions partition(day='1112'); 3、添加分区
alter table dept_partitions add partition(day='1113'); 4、单分区查询
select * from dept_partitions where day='1112'; 5、全查询
select * from dept_partitions; 6、查询表结构
desc formatted dept_partitions; 7、删除单个分区
alter table dept_partitions drop partition(day='1112'); 二、修改表
1、修改表名
alter table emptable rename to new_table_name; 2、添加列
alter table dept_partitions add columns(desc string); 3、更新列
alter table dept_partitions change column desc desccc int; 4、替换
alter table dept_partitions replace columns(desccc int); 三、DML数据操作
1、向表中加载数据
load data local inpath '/root/student.txt' into table student; 2、加载hdfs中数据
load data inpath '/student.txt' into table student;
提示:相当于剪切 3、覆盖原有的数据
load data local inpath '/root/student.txt' overwrite into table student; 4、创建分区表
create table student_partitions(id int,name string) partitioned by (month string) row format
delimited fields terminated by '\t'; 5、向分区表插入数据
insert into table student_partitions partition(month='201811') values(1,'tom'); 6、按照条件查询结果存储到新表
create table if not exists student_ppp as select * from student_partitions where name='tom'; 7、创建表时加载数据
create table db_h(id int,name string)
row format
delimited fields
terminated by "\t"
location '/root/student.txt'; 8、查询结果导出到本地
hive> insert overwrite local directory '/root/datas/student.txt' select * from student where name='tom'; bin/hive -e 'select * from student' > /root/student.txt hive> dfs -get /usr/hive/warehouse/00000 /root;

附件2:数据部门表 dept.txt

10    ACCOUNTING    1700
20 RESEARCH 1800
30 SALES 1900

五、查询与函数

一、查询
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> 2、基本查询
(1)全表查询select * from empt;
(2)查询指定列select empt.empno,empt.empname from empt;
(3)列别名select ename name,empno from empt; 3、算数运算符
算数运算符 描述 Col3
+ 相加   field3
­ 相减   field3
* 相乘    field3
/ 相除   field3
% 取余   field3
& 按位取与 field3
按位取或
^ 异或   field3
~ 按位取反 field3 二、函数
(1)求行数count select count(*) from empt;
(2)求最大值max select max(empt.sal) sal_max from empt;
(3)求最小值 select min(empt.sal) sal_min from empt;
(4)求总和 select sum(empt.sal) sal_sum from empt;
(5)求平均值 select avg(empt.sal) sal_avg from empt;
(6)前两条 select * from empt limit2; 三、where语句
(1)工资大于1700的员工信息 select * from empt where empt.sal > 1700;
(2)工资小于1800的员工信息 select * from empt where empt.sal < 1800;
(3)查询工资在1500到1800区间的员工信息 select * from empt where empt.sal between 1500 and 1800;
(4)查询有奖金的员工信息 select * from empt where empt.comm is not null;
(5)查询无奖金的员工信息 select * from empt where empt.comm is null;
(6)查询工资是1700和1900的员工信息 select * from empt where empt.sal in(1700,1900); 四、Like使用like运算选择类似的值选择条件可以包含字母和数字
(1)查找员工薪水第二位为6的员工信息 select * from empt where empt.sal like'_6%'; _代表一个字符 %代表0个或多个字符
(2)查找员工薪水中包含7的员工信息 select * from empt where empt.sal like'%7%';
(3)rlike--select * from empt where empt.sal rlike'[7]'; 五、分组
(1)Group By语句计算empt表每个部门的平均工资 select avg(empt.sal) avg_sal,deptno from empt group by deptno;
(2)计算empt每个部门中最高的薪水 select max(empt.sal) max_sal,deptno from empt group by deptno;
(3)求部门平均薪水大于1700的部门 select deptno,avg(sal) avg_sal from empt group by deptno having avg_sal>1700;注意:having只用于group by分组统计语句 六、其他语句
(1)查询薪水大于1700并且部门是40 员工信息
select * from empt where deptno=40 and empt.sal>1700;
(2)查询薪水除了10部门和40部门以外的员工信息
select * from empt where deptno not in(10,40);
(3)查询薪水大于1700或者部门是40的员工信息
select * from empt where sal>1700 or deptno=40;

六、join和分桶

一、Join操作
(1)等值join
根据员工表和部门表中部门编号相等,查询员工编号、员工名、部门名称
select e.empno,e.ename,d.dept from empt e join dept d on e.deptno = d.deptno;
(2)左外连接 left join
null
select e.empno,e.ename,d.dept from empt e left join dept d on e.deptno = d.deptno;
(3)右外连接 right join
select e.empno,e.ename,d.dept from dept d right join empt e on e.deptno = d.deptno;
(4)多表连接查询
查询员工名字、部门名称、员工地址
select e.ename,d.dept,l.loc_name from empt e join dept d on e.deptno = d.deptno join location l on d.loc = l.loc_no;
(5)笛卡尔积
select ename,dept from empt,dept;
为了避免笛卡尔积采用设置为严格模式
查看:set hive.mapred.mode;
设置:set hive.mapred.mode = strict; 二、排序
(1)全局排序 order by
查询员工信息按照工资升序排列
select * from empt order by sal asc;默认
select * from empt order by sal desc;降序
(2)查询员工号与员工薪水按照员工二倍工资排序
select empt.empno,empt.sal*2 two2sal from empt order by two2sal;
(3)分区排序
select * from empt distribute by deptno sort by empno desc; 三、分桶
分区表分的是数据的存储路径
分桶针对数据文件
(1)创建分桶表
create table emp_buck(id int,name string)
clustered by(id) into 4 buckets
row format delimited
fields terminated by '\t';
(2)设置mapreduce数量
set mapreduce.job.reduces;
(3)设置分桶属性:
set hive.enforce.bucketing = true;
(4)导入数据
insert into table emp_buck select * from emp_b;
注意:分区分的是文件夹 分桶是分的文件
(5)应用
抽样测试

附件3:数据地址表 location.txt

1700    Beijing
1800 London
1900 Tokyo

附件4:数据分桶数据表 emp_b.txt

2001    hhh1
2002 hhh2
2003 hhh3
2004 hhh4
2005 hhh5
2006 hhh6
2007 hhh7
2008 hhh8
2009 hhh9
2010 hhh10
2011 hhh11
2012 hhh12
2013 hhh13
2014 hhh14
2015 hhh15
2016 hhh16

七、Hive优化

一、自定义函数
之前使用hive自带函数sum/avg/max/min...
三种自定义函数:
UDF:一进一出(User-Defined-Function)
UDAF:多进一出(count、max、min)
UDTF:一进多出
(1)导入hive依赖包 hive/lib下
(2)上传 alt+p
(3)添加到hive中 add jar /root/lower.jar;
(4)关联 create temporary function my_lower as "com.css.com.Lower";
(5)使用 select ename,my_lower(ename) lowername from empt; 二、Hive优化
1、压缩
(1)开启Map阶段输出压缩
开启输出压缩功能:
set hive.exec.compress.intermediate=true;
开启map输出压缩功能:
set mapreduce.map.output.compress=true;
设置压缩方式:
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
例子:
select count(ename) name from empt; (2)开启reduce输出端压缩
开启最终输出压缩功能:
set hive.exec.compress.output=true;
开启最终数据压缩功能:
set mapreduce.output.fileoutputformat.compress=true;
设置压缩方式:
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.
compress.SnappyCodec;
设置块压缩:
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
例子:
insert overwrite local directory '/root/compress/rsout' select * from empt sort by empno desc; 2、存储
Hive存储格式:TextFile/SequenceFile/orc/Parquet
orc:Index Data/row Data/stripe Footer
压缩比:
orc > parquet > textFile
查询速度:
orc > textFile
50s > 54s 例子:
create table itstar(time string,host string) row format delimited fields terminated by '\t';
load data local inpath '/root/itstar.log' into table itstar;
create table itstar_log(time string,host string) row format delimited fields terminated by '\t' stored as orc;
insert into itstar_log select * from itstar;
select count(*) from itstar;
select count(*) from itstar_log; 3、Group by优化
分组:mr程序,map阶段把相同key的数据分发给一个reduce,一个key的量很大。
解决方案:
在map端进行聚合(combiner)
set hive.map.aggr=true;
设置负载均衡
set hive.groupby.skewindata=true; 4、数据倾斜
(1)合理避免数据倾斜
合理设置map数
合并小文件
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
合理设置reduce数
(2)解决数据倾斜
在map端进行聚合(combiner)
set hive.map.aggr=true;
设置负载均衡
set hive.groupby.skewindata=true;
(3)JVM重用
mapred-site.xml
mapreduce.job.jvm.numtasks
10~20 (插槽)

附件5:Lower类的代码如下:

package com.css.com;

import org.apache.hadoop.hive.ql.exec.UDF;

public class Lower extends UDF {
public String evaluate(final String s) {
if (s == null)
return null;
return s.toLowerCase();
}
}

附件6:数据表itstar.log(未显示全部)

20180724101954    http://java.itstar.com/java/course/javaeeadvanced.shtml
20180724101954 http://java.itstar.com/java/course/javaee.shtml
20180724101954 http://java.itstar.com/java/course/android.shtml
20180724101954 http://java.itstar.com/java/video.shtml
20180724101954 http://java.itstar.com/java/teacher.shtml
20180724101954 http://java.itstar.com/java/course/android.shtml
20180724101954 http://bigdata.itstar.com/bigdata/teacher.shtml
20180724101954 http://net.itstar.com/net/teacher.shtml
20180724101954 http://java.itstar.com/java/course/hadoop.shtml
20180724101954 http://java.itstar.com/java/course/base.shtml
...
...
...
20180724102628 http://java.itstar.com/java/course/javaeeadvanced.shtml
20180724102628 http://java.itstar.com/java/course/base.shtml
20180724102628 http://net.itstar.com/net/teacher.shtml
20180724102628 http://net.itstar.com/net/teacher.shtml
20180724102628 http://net.itstar.com/net/course.shtml
20180724102628 http://java.itstar.com/java/course/android.shtml
20180724102628 http://net.itstar.com/net/course.shtml
20180724102628 http://java.itstar.com/java/course/base.shtml
20180724102628 http://java.itstar.com/java/video.shtml
20180724102628 http://java.itstar.com/java/course/hadoop.shtml

Hive简介及使用的更多相关文章

  1. Hive入门学习--HIve简介

    现在想要应聘大数据分析或者数据挖掘岗位,很多都需要会使用Hive,Mapreduce,Hadoop等这些大数据分析技术.为了充实自己就先从简单的Hive开始吧.接下来的几篇文章是记录我如何入门学习Hi ...

  2. 大数据 Hive 简介

    第一部分:Hive简介 什么是Hive •Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. •本质是将SQL转换为MapReduce程序 ...

  3. Hadoop入门第五篇:Hive简介以及部署

    标签(空格分隔): Hadoop Hive hwi 1.Hive简介   之前我一直在Maxcompute上进行大数据开发,所以对数仓这块还算比较了解,在接受Hive的时候基本上没什么大的障碍.所以, ...

  4. 数据仓库Hive(一)——hive简介,产生,安装

    1.Hive简介 数据仓库 解释器.编译器.优化器等 运行时,元数据存储在关系型数据库里面 1.1数据库和数据仓库的区别 数据库需要立即返回结果,数据仓库不需要 数据仓库能收纳各种数据源,而数据库只能 ...

  5. Hive——简介

    Hive--简介 Hive 是基于 Hadoop 构建的一套数据仓库分析系统,它提供了丰富的 SQL 查询方式来分析存储在 Hadoop 分布式文件系统中的数据, 可以将结构化的数据文件映射为一张数据 ...

  6. Hive简介

    实验简介 我们本节课程主要介绍 Hive 的相关知识,将会涉及以下内容: Hive 的定义 Hive 的体系结构 Hive 与关系数据库的区别 Hive 的应用场景 Hive 的存储 一.什么是 Hi ...

  7. 【Hive学习之一】Hive简介

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...

  8. HIVE简介及安装

    一.简介 百度百科HIVE定义: hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运 ...

  9. Apache Hive 简介及安装

    简介 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件 映射为一张数据库表,并提供类 SQL 查询功能. 本质是将 SQL 转换为 MapReduce 程序. 主要用途:用来 ...

随机推荐

  1. android 批量上传图片

    额外还需要NetUtil和服务器端UpLoadPicture package com.example.girdviewtest; import java.util.ArrayList;import j ...

  2. 一款基于jQuery的联动Select下拉框

    今天我们要来分享一款很实用的jQuery插件,它是一个基于jQuery多级联动的省市地区Select下拉框,并且值得一提的是,这款联动下拉框是经过自定义美化过的,外观比浏览器自带的要漂亮许多.另外,这 ...

  3. spark读取本地文件

    /** * Read a text file from HDFS, a local file system (available on all nodes), or any * Hadoop-supp ...

  4. JS 数组以及对象的深拷贝总结

    javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法 前言 在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝.如下图演示:  如上,arr的修改,会影响arr2的值,这 ...

  5. Java的图形界面依然是跨平台的

    Awt:抽象窗口工具箱,它由三部分组成: ①组件:界面元素: ②容器:装载组件的容器(例如窗体): ③布局管理器:负责决定容器中组件的摆放位置. 图形界面的应用分四步: ① 选择一个容器: ⑴wind ...

  6. wifi的web 认证。

    wifi的web 认证.wifidog+authpuppy+php 或者Wiwiz Auth API

  7. elasticsearch中mapping的_source和store的笔记

    0.故事引入 无意中看到了ES的mapping中有store字段,作为一个ES菜鸡,有必要对这个字段进行下笔记. 1._source _source字段我在们进行检索时相当重要, ES默认检索只会返回 ...

  8. JQuery获取和设置select下拉框的值

    获取Select : 获取select 选中的 text : $("#sid").find("option:selected").text(); 获取selec ...

  9. Linq系列(5)——表达式树之案例应用

    在进入今天的正题之前,先感慨下本人的blog的人气一篇不如一篇.再加上换公司后人身自由受到了比之前大得多得多的限制,实在令本人有些郁闷.不过每次提笔写些东西跟大家分享,总是能让我感到愉悦和欣慰,希望我 ...

  10. hdu 4496(并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4496. 思路:简单并查集应用,从后往前算就可以了. #include<iostream> ...