数据分析服务端大数据进阶我爱编程

大数据学习之Hive入门

2018-06-27  本文已影响380人  月伴飞鱼

Hive是基于Hadoop HDFS之上的数据仓库

**数据仓库:本质上就是一个数据库。但有别于我们通常意义上的数据库 **

数据仓库是一个面向主题的、集成的、不可更新的、随时间不变化的数据集合,它用于支持企业或组织的决策分析处理。

数据仓库的结构和建立过程:

数据源(可能来源于业务数据库系统、文档资料和其他数据)——>数据存储及管理(ETL:抽取(Extract)、转换(Transform)、装载(Load))——>数据仓库引擎(不同的服务器提供有不同的功能)——>前端展示(数据查询、数据报表、数据分析、各类应用来自不同的服务器)

抽取Extract:提取不同数据源的数据
转化Transform:转化格式,不同数据源的数据格式可能不一致
装载Load:将满足数据格式的数据装载到数据仓库

OLTP应用:联机事务处理,面向事物,银行转账,扣钱和加钱的动作应该同时完成,不能只有扣钱没有加钱,或者只有加钱,没有扣钱操作频率高,典型应用-银行转账

OLAP应用:联机分析处理,典型应用-商品推荐系统 ,一般只做查询,不做更新插入操作

数据仓库的数据模型:星型模型和雪花模型

以商品信息为核心构建的星型模型

什么是Hive

Hive是建立在Hadoop HDFS上的数据仓库基础架构。而传统的Oracle或MySQL数据仓库是直接建立在Oracle或MySQL数据库之上的。

②Hive可以用来进行数据提取、转化、加载(ETL)。
③Hive定义了简单的类似SQL查询语言,称为HQL它允许熟悉SQL的用户查询数据。

④Hive允许熟悉MapReduce开发者的开发自定义的mapper和reducer来处理內建mapper和reducer无法完成的复杂的分析工作。
⑤Hive是SQL解析引擎,它将SQL语句转化成Map、Reduce Job 然后在Hadoop执行
⑥Hive的表其实就是HDFS的目录/文件。

Hive的体系结构

Hive的体系结构之元数据

Hive讲元数据存储在数据库中(metastore),支持mysql、derby、oracle等传统数据库,默认为derby

Hive中元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在的目录等。

元数据被默认创建在derby数据库中,以表的形式保存数据。表的元信息、列元信息。

Hive的体系结构之HQL的执行过程

①解析器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。

过程:HQL语句——》解析器:词法分析——》编译器:生成HQL的执行计划——》优化器:生成最优执行计划——》执行。

②在oracle数据库中:
执行计划
explanin plan for select * from emp where deptno=10;
查询执行计划
select * from table(dbms_xplan.display);
全表扫描
创建索引
create index myindex on emp(deptno)

Hive的执行计划跟上面的oracle的执行计划类似。

Hive体系结构

•hadoop
–用HDFS进行存储,利用mapreduce进行计算。
•元数据存储(metastroe)
–通常存储在关系数据库中,如mysql,derby。

Hive Driver:驱动,包括编译器、解析器、优化器。
访问接口:①CLI:Command Line Interface;②通过JDBC/ODBC连接Thrift Server在连接驱动;③Web Console 控制台(只能查询)

Hive的安装

Hive的安装模式

①Apache的hive官网:hive.apache.org中下载hive.

bin.tar包为安装包
src.tar为源代码,可用来编译hive的可执行程序,通过源文件生成打包生成基于web的图形化管理工具,再部署到hive中,才可使用该图形化管理工具。

Hive的源码中集成有WEB UI管理工具, 需要自行编译发布到Hive环境中. 注意Hive的安装包中并不会集成WEB UI

②安装hive之前要先安装hadoop,hadoop可以是单机环境、伪分布环境和集群环境中的一种。
Hive的安装有三种模式:嵌入模式、本地模式和远程模式。
1. 嵌入模式: 即使用Hive自带的Derby数据库, 将元数据及其信息存储在Derby数据库上面, 但有个缺点, Derby在同一时间只能接受一个连接(即只能允许一个人对hive进行操作), 故一般用作演示
2. 本地模式: 将元数据存储到同一机器中的MySQL数据库当中, 此模式一般用于开发与测试
3. 远程模式: 即是本地模式的升级版, 可将Hive的元数据存储到其它环境(可以是不同操作系统)机器上的MySQL当中.

Hive安装之嵌入模式

只需要解压Hive安装包, 然后直接执行bin目录的hive脚本(执行./hive命令), 便会自动创建一个metastore_db目录来保存元数据. 注意: 这个metastore_db目录是自动创建在执行hive时的当前目录下面, 即在嵌入模式中任意一个目录下执行hive都会创建此目录.

将hive的目录加到系统的path路径下,这样就可以在任何地方使用hive命令了

vim ~/.bashrc

命令讲解:

quit; #退出hive命令行

Hive安装之远程模式和本地模式

远程配置HIVE;命名hive-site.xml,要配置mysql的url、驱动、用户名、密码。

Hive远程模型安装(与Hive本地模类似)

  1. 安装MYSQL在一台独立机子上(Windows上)
  2. 安装Hive在另一台独立机子上(Linux上)
    本地先在mysql中创建一个hive数据库,用于保存hive的元数据信息
    上传mysql的驱动包到hive的lib目录下
    在conf目录下配置hive-site.xml文件(这个文件不存在):
    可以根据模文件:hive-default.xml.template 创建

参考官网文档:
https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin#AdminManualMetastoreAdmin-RemoteMetastoreDatabase
最后执行hive命令,则元数据的信息就会保存到mysql数据库的hive数据库中了

Hive的管理

Hive管理之CLI方式

hive中的数据对应与hadoop hdfs中的一个文件夹

进入CLI(命令行)方式:
① 直接输入#/bin/hive的执行程序(配置好环境变量后可以直接执行hive命令)
②或者输入#hive --service cli
退出CLI方式:
① quit;
② exit;

常用的CLI的命令:
① 清屏: Ctrl + L 或者 !clear
② 查看数据仓库中的表: show tables;
③ 查看数据仓库中内置的函数: show functions;
④ 查看表的结构: desc 表名
⑤ 查看HDFS上的文件: dfs –ls 目录
dfs –lsr 目录 (-lsr表示以递归的方式查看子目录)
⑥ 执行操作系统的命令(如Linux命令): ! 命令
⑦ 执行HQL语句: 例如select * from **,这个HQL语句不会产生MapReduce作业

上面这个url地址可以直接查看MapReduce的执行过程

⑧ 执行SQL的脚本: source SQL文件,如:source /root/my.sql
⑨ 命令“hive –S(大写S)”: 进入静默模式:不产生hive的调试信息(mapreduce过程),只显示最后的结果。
⑩ hive –e ’HQL语句’ : 不进入hive命令行直接执行HQL.

注意:hive中用--表示注释,如show tables --查看表;

Hive管理之web界面方式

web界面只能进行查询的操作

启动web界面方式:
-端口号:9999
-启动方式:#hive --service hwi &
-通过浏览器来访问:http://<ip地址>:9999/hwi/

解决:下载hive的源代码包,解压
进入源码包的hwi目录下,里面有个web目录
打包war包:

jar cvfM0 hive-hwi-0.13.0.war -C web/ .

把web目录下的所有文件打包成hive-hwi-0.13.0.war包,然后就可以对这个war包进行部署

然后将这个war包拷贝到hive的lib目录下
修改conf目录下的hive-site.xml文件

<name>hive.hwi.listen.host</name>
<value>0.0.0.0</value>

<name>hivehwi.listen.port</name>
<value>9999</value>

<name>hive.hwi.war.file</name>
<value>lib/hive-hwi-0.13.0.war</value>

拷贝jdk的lib目录下的tools.jar到hive的lib目录下:

cp jdk/lib/tools.jar hive/lib/

Hive管理之远程模式

远程服务启动方式:
-端口号:10000
-启动方式:#hive --service hiveserver &
即启动了Hive Thrift Server
注意:如果以JDBC或ODBC的程序登录到hive中操作数据时,必须选用远程服务启动方式。

Hive的数据类型

基本数据类型

复杂数据类型

creat table student
(sid int, sname string, grade array<float>);
{1,Tom,[80,90,75]}

creat table student1
(sid int, sname string, grade map<string, float>);
{1,Tom,<'语文',85>}

array和map的嵌套使用
creat table student2
(sid int, sname string, grades array<map<string,float>>);
{1,Tom, [<'语文',80>,<'英语',90>]}

Struct:结构类型,可以包含不同数据类型的元素。这些元素可以通过“点语法”的方式来得到所需要的元素。

creat table student3
(sid int, info struct<name:string, age:int, sex:string>);
{1,{'Tom',10,'男'}}

时间数据类型

时间类型:

Hive的数据存储

当我们在Hive中创建了一张表,就相当于在HDFS中创建了一个文件夹,而表中的数据就相当于文件夹中的文件。

基于HDFS
没有专门的数据存储格式,可以用.txt、.csv,默认情况下可以用’\t’作为分隔符
存储结构主要包括:数据库、文件、表、视图。
可以直接加载文本文件(.txt文件等)
创建表时,制定hive数据的列分隔符与行分隔符

表:

内部表

内部表(Table)

creat table student
(sid int, sname string, age int)
location '/mytable/hive/student';//可以指定报存的位置

指定行分隔符:row format delimited fileds terminated by ‘,’;

creat table student
(sid int, sname string, age int)
location '/mytable/hive/student';
row formats delimited fields terminated by ',';

修改表添加新的一列:alter table t1 add columns(列名 数据类型);

删除表时:如果开启了Hadoop的回收站功能,则drop表后会放在.trash,也就是说可以通过一定方式找回删除的表。

分区表

创建一个partition表

creat table partition_table
(sid int, sname string)
partitioned by (gender string)
row format delimited fields terminated by ',';

向partition表中添加数据

insert into partition_table partition(gender='M') select sid,sname from sample_data where gender='M';

分区表(Partition)

查看分区与未分区情况下执行计划有何不同:
(执行计划读取的顺序是,从下往上,从右往左)

explain select * from from sample_data where gender = 'M'; //未分区
explain select * from from partition_table where gender = 'M'; //分区

可以通过explain语句查看HQL的执行计划,读执行计划STAGE PLANS的方式:从下往上,从右往左读。
Oracle中也有分区表,五种分区表。

外部表

外部表(external table)

桶表

桶表(bucket table)

create table bucket_table
(id int,name string)
clustered by(name) into 3 buckets //按name进行哈希,哈希到3个表中
row format delimited
fields terminated by ‘\t’;
//clustered要在row的前面,否则报错。

视图

视图(view)

create view empinfo
as
select e.empno, e.ename, e.sal, e.sal*12 annlsal, d.dname
from emp e, dept d
where e.deptno = d.deptno;

上一篇 下一篇

猜你喜欢

热点阅读