Hive简单使用
Posted 捡黄金的少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive简单使用相关的知识,希望对你有一定的参考价值。
1、数据仓库与数据库区别
-
数据库与数据仓库的区别实际讲的是OLTP 与 OLAP 的区别。
-
操作型处理,叫联机事务处理 OLTP(On-Line Transaction Processing),也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理OLTP。
-
分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing),一般针对某些主题的历史数据进行分析,支持管理决策。
-
首先要明白,数据仓库的出现,并不是要取代数据库。
-
数据库是面向事务的设计,数据仓库是面向主题设计的。
-
数据库一般存储业务数据,数据仓库存储的一般是历史数据。
-
数据库设计是尽量避免冗余,一般针对某一业务应用进行设计;比如一张简单的User表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析;数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
-
数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
-
以银行业务为例。数据库是事务系统的数据平台,客户在银行做的每笔交易都会写入数据库,被记录下来,这里,可以简单地理解为用数据库记账。数据仓库是分析系统的数据平台,它从事务系统获取数据,并做汇总、加工,为决策者提供决策的依据。比如,某银行某分行一个月发生多少交易,该分行当前存款余额是多少。如果存款又多,消费交易又多,那么该地区就有必要设立ATM了。
-
显然,银行的交易量是巨大的,通常以百万甚至千万次来计算。事务系统是实时的,这就要求时效性,客户存一笔钱需要几十秒是无法忍受的,这就要求数据库只能存储很短一段时间的数据。而分析系统是事后的,它要提供关注时间段内所有的有效数据。这些数据是海量的,汇总计算起来也要慢一些,但是,只要能够提供有效的分析数据就达到目的了。
-
-
数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它决不是所谓的“大型数据库”。
-
2、数据仓库分层架构
-
按照数据流入流出的过程,数据仓库架构可分为三层——源数据层、数据仓库层、数据应用层。
-
数据仓库的数据来源于不同的源数据,并提供多样的数据应用,数据自下而上流入数据仓库后向上层开放应用,而数据仓库只是中间集成化数据管理的一个平台。
-
源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。
-
数据仓库层(DW):也称为细节层,DW层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。
-
数据应用层(DA或APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。
-
数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为是ETL(抽取Extra, 转化Transfer, 装载Load)的过程,ETL是数据仓库的流水线,也可以认为是数据仓库的血液,它维系着数据仓库中数据的新陈代谢,而数据仓库日常的管理和维护工作的大部分精力就是保持ETL的正常和稳定。
2.1、Hive与数据库的区别
-
Hive 具有 SQL 数据库的外表,但应用场景完全不同。
-
==Hive 只适合用来做海量离线数据统计分析,也就是数据仓库==。
2.2 Hive的优缺点
-
==优点==
-
操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
-
避免了去写MapReduce,减少开发人员的学习成本。
-
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
-
-
==缺点==
-
Hive 的查询延迟很严重
-
hadoop jar xxxx.jar xxx.class /input /output
-
进行任务的划分,然后进行计算资源的申请
-
map 0% reduce 0%
-
map 10% reduce 0%
-
-
Hive 不支持事务
-
2.3、Hive的交互方式
-
Hive的交互方式主要有三种
-
使用Hive之前:
-
==先启动hadoop集群==:因为hql语句会被编译成MR任务提交到集群运行;hive表数据一般存储在HDFS上
-
==mysql服务==:因为对hive操作过程中,需要访问mysql中存储元数据的库及表
-
2.4 hive的使用
1、启动hadoop集群,启动mysql服务
[hadoop@node03 ~]$ hive
1、查看下面所有的数据库
show databases;
2、Hive JDBC服务
-
启动hiveserver2服务,前台启动与后台启动方式二选一
-
前台启动
[hadoop@node03 ~]$ hive --service hiveserver2
-
后台启动
[hadoop@node03 ~]$ nohup hive --service hiveserver2 &
-
beeline连接hiveserver2服务
若是前台启动hiveserver2,请再开启一个新会话窗口,然后使用beeline连接hive
[hadoop@node03 ~]$ beeline --color=true beeline> !connect jdbc:hive2://node03:10000
用户名hadoop,密码为空即可
3、Hive的命令
-
hive ==-e== hql语句
-
使用 –e 参数来直接执行hql语句
-
[hadoop@node03 ~]$ hive -e "show databases"
-
hive ==-f== sql文件
使用 –f参数执行包含hql语句的文件
node03执行以下命令准备hive执行脚本
[hadoop@node03 ~]$ cd /kkb/install/ [hadoop@node03 install]$ vim hive.sql
文件内容如下
create database if not exists myhive;
通过以下命令来执行我们的hive脚本
[hadoop@node03 install]$ hive -f /kkb/install/hive.sql
查看效果,成功执行hql语句,创建myhive数据库
show databases
4、hive中Array类型
-
array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[1]的值为'b'
-
准备数据文件
-
t_array.txt (字段空格分割)
1 zhangsan beijing,shanghai
2 lisi shanghai,tianjin
2、创建t_array.txt源数据
cd /home/hadoop
vim t_array.txt
3、使用 myhive 数据库
use myhive;
4、在数据库中创建表
create table t_array( id string, name string, locations array<string> ) row format delimited fields terminated by ' ' collection items terminated by ',';
5、在hive中运行命令
load data local inpath '/home/hadoop/t_array.txt' into table t_array;
6、查询数据
select * from t_array
select id,name,locations[0],locations[1] from t_array;
desc formatted myhive. t_array
查询表的基本信息(table type: MANAGED_TABLE表示内部表)
5、Map类型
Map类型
-
map类型中存储key/value类型的数据,后期可以通过["指定key名称"]访问
-
准备数据文件
-
t_map.txt (字段空格分割)
1 name:zhangsan#age:30 2 name:lisi#age:40
-
-
建表语法
create table t_map( id string, info map<string,string> ) row format delimited fields terminated by ' ' collection items terminated by '#' map keys terminated by ':';
-
加载数据
load data local inpath '/home/hadoop/t_map.txt' into table t_map;
-
查询数据
select id, info['name'], info['age'] from t_map;
6、Struct类型
-
可以存储不同类型的数据
-
例如c的类型为structa INT; b INT,我们可以通过c.a来访问域a
-
-
准备数据文件
-
t_struct.txt (字段空格分割)
1 zhangsan:30:beijing 2 lisi:40:shanghai
-
-
建表语法
create table t_struct( id string, info struct<name:string, age:int, address:String> ) row format delimited fields terminated by ' ' collection items terminated by ':' ;
-
加载数据
load data local inpath '/home/hadoop/t_struct.txt' into table t_struct;
-
查询数据
select id,info.name,info.age,info.address from t_struct;
7、创建内部表
use myhive;
create table stu(id int, name string);可以通过insert into向hive表当中插入数据,但是不建议工作当中这么做;因为每个insert语句转换成mr后会生成一个文件
insert into stu(id,name) values(1,"zhangsan");
insert into stu(id,name) values(2,"lisi");select * from stu;
8、创建外部表
-
外部表因为是指定其他的hdfs路径的数据加载到表当中来
-
所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据仍然存放在hdfs当中,不会删掉
create external table myhive.teacher (t_id string, t_name string) row format delimited fields terminated by '\\t';
-
创建外部表的时候需要加上==external== 关键字
-
location字段可以指定,也可以不指定
-
指定就是数据存放的具体目录
-
不指定就是使用默认目录 ==/user/hive/warehouse==
-
-
向外部表当中加载数据:
-
我们前面已经看到过通过insert的方式向内部表当中插入数据,外部表也可以通过insert的方式进行插入数据,只不过insert的方式,我们一般都不推荐
-
实际工作当中我们都是使用load的方式来加载数据到内部表或者外部表
-
-
load数据可以从本地文件系统加载或者也可以从hdfs上面的数据进行加载
-
从本地文件系统加载数据到teacher表当中去,==将我们附件当汇总的数据资料都上传到node03服务器的/kkb/install/hivedatas路径下面去==
mkdir -p /kkb/install/hivedatas
-
将数据都上传到/kkb/install/hivedatas路径下
-
然后在hive客户端下执行以下操作
load data local inpath '/kkb/install/hivedatas/teacher.csv' into table myhive.teacher;
-
-
从hdfs上面加载文件到teacher表里面去(将teacher.csv文件上传到==hdfs的/kkb/hdfsload/hivedatas==路径下)
cd /kkb/install/hivedatas hdfs dfs -mkdir -p /kkb/hdfsload/hivedatas hdfs dfs -put teacher.csv /kkb/hdfsload/hivedatas # 在hive的客户端当中执行 load data inpath '/kkb/hdfsload/hivedatas' overwrite into table myhive.teacher;
9、 内部表与外部表的互相转换
-
1、内部表转换为外部表
#将stu内部表改为外部表 alter table stu set tblproperties('EXTERNAL'='TRUE');
-
2、外部表转换为内部表
#把teacher外部表改为内部表 alter table teacher set tblproperties('EXTERNAL'='FALSE');
10、 内部表与外部表的区别
-
1、建表语法的区别
-
外部表在创建的时候需要加上==external==关键字
-
-
2、删除表之后的区别
-
内部表删除后,表的元数据和真实数据都被删除了
-
外部表删除后,仅仅只是把该表的元数据删除了,真实数据还在,后期还是可以恢复出来
-
11、内部表与外部表的使用时机
-
内部表由于删除表的时候会同步删除HDFS的数据文件,所以确定如果一个表仅仅是你独占使用,其他人不使用的时候就可以创建内部表,如果一个表的文件数据,其他人也要使用,那么就创建外部表
-
一般外部表都是用在数据仓库的ODS层
-
内部表都是用在数据仓库的DW层
以上是关于Hive简单使用的主要内容,如果未能解决你的问题,请参考以下文章
JAVA——实际应用——使用JAVA语言写一个简单ATM项目,实现用户注册登录存款取款转账等功能