大数据----hive

1.Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件 映射为一张数据库表,并提供类 SQL 查询功能。本质是将 SQL 转换为 MapReduce 程序。主要用途:用来做离线数据分析,比直接用 MapReduce 开发效率更高

2.离线项目在使用hive的前后区别

之前用 Hadoop MapReduce 人员学习成本高,MapReduce 实现复杂查询逻辑开发难度太大

之后使用hive:操作接口采用类 SQL 语法,提供快速开发的能力避免了去写 MapReduce,减少开发人员的学习成本功能扩展很方便

3.Hive与hadoop

Hive利用HDFS存储数据,利用MapReduce查询分析数据。使用hive首先在hdfs上要有结构化数据,然后把结构化数据映射成我们hive的表,hive封装了sql语法解析器和mr程序模板库,就可以用hsql生成mr程序操作数据,

4.hive架构:

5.hive组件:用户接口:包括 CLI、JDBC/ODBC、WebGUI。其中,CLI(command lineinterface)为 shell 命令行;JDBC/ODBC 是 Hive 的 JAVA 实现,与传统数据库JDBC 类似;WebGUI 是通过浏览器访问 Hive。

元数据存储:通常是存储在关系数据库如 mysql/derby 中。Hive 将元数据存储在数据库中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

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

6.Hive安装与部署

Hive 安装前需要安装好 JDK 和 Hadoop。配置好环境变量。

根据元数据存储的介质不同,分为下面两个版本,其中 derby 属于内嵌模式。实际生产环境中则使用 mysql 来进行元数据的存储

内置derby版:

解压hive安装包

bin/hive启动即可使用

缺点:不同路径启动hive,每一个hive拥有一套自己的元数据,无法共享

mysql版:

解压、修改配置文件

vi conf/hive-site.xml

配置 Mysql 元数据库信息

7.Hive的使用方式

平时自己学习可以用hive交互shell的方式启动hive:bin/hive

开发模式中是将hive启动为一个服务器,来对外提供服务,操作是通过服务来远程连接的,这种模式的操作是在hive节点服务器操作bin/hiveserver2命令,这是会一直处于等待模式,运行的进程多了一个RunJar,

然后在我们可操作的节点用beeline去连接,

命令:bin/beeline -u jdbc:hive2://(hive节点:端口号) -n root

或者:bin/beeline

! Connect jdbc:hive2://(hive节点:端口号)

这样就可以操作了,而且前提我们配置了源数据的存储数据库(例如mysql)后,在任何节点操作hive,都是操作同一个源数据的hive,不会出现不同节点不同目录操作不同hive源数据的情况。

8.Hive与结构化数据的映射

建立hive数据库与数据表都会在hdfs产生相应的目录(hive/warehouse)我们建立表的时候字段应该与结构化数据的列对应上,并且建表时规定分隔符,最后结构化数据复制到相应的目录(hive/warehouse)就可以完成映射。映射成功以后就可以通过sql来操作分析结构化数据(注意实质底层还是生成了mr程序)。

9.建表语法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_name data_type [COMMENT col_comment], ...)]

[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]

[ROW FORMAT row_format]

[STORED AS file_format]

[LOCATION hdfs_path]

    9.1CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用  IF NOT EXISTS S 选项来忽略这个异常。

    9.2EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径( LOCATION)。Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

    9.3LIKE 允许用户复制现有的表结构,但是不复制数据。CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name LIKE existing_table;

    9.4ROW FORMAT  DELIMITED

[FIELDS TERMINATED BY char]

[COLLECTION ITEMS TERMINATED BY char]

[MAP KEYS TERMINATED BY char]

[LINES TERMINATED BY char] | SERDE serde_name

[WITH SERDEPROPERTIES

(property_name=property_value, property_name=property_value,...)]

hive 建表的时候默认的分割符是'\001',若在建表的时候没有指明分隔符,load 文件的时候文件的分隔符需要是'\001';若文件分隔符不是'001',程序不会

报错,但表查询的结果会全部为'null';

用 vi 编辑器 Ctrl+v 然后 Ctrl+a 即可输入'\001' -----------> ^A

SerDe 是 Serialize/Deserilize 的简称,目的是用于序列化和反序列化。

Hive 读取文件机制:首先调用 InputFormat(默认 TextInputFormat),返回一条一条记录(默认是一行对应一条记录)。然后调用SerDe (默认LazySimpleSerDe)的 Deserializer,将一条记录切分为各个字段(默认'\001')。

Hive 写文件机制:将 Row 写入文件时,主要调用 OutputFormat、SerDe 的Seriliazer,顺序与读取相反。

可通过 desc formatted 表名;进行相关信息查看。

当我们的数据格式比较特殊的时候,可以自定义 SerDe。

    9.5PARTITIONED BY

在 hive Select 查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此建表时引入了 partition  分区概念。

分区表指的是在创建表时指定的 partition 的分区空间。一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。表和列名不区分大小写。分区是以字段的形式在表结构中存在,通过 describe table 命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示。

分区表是为了房子查询的时候全表扫描浪费资源与时间。

分区表就是在建表hdfs目录下多了一级或者多级目录,文件夹名字就是分区值。

分区字段在查询的时候会显示出来,但是是虚拟出来用于标识文件的,真实的结构化数据是没有这个字段的。并且分区字段一定不与表中字段重复,一样会出现问题。

    9.6CLUSTERED BY INTO num_buckets BUCKETS

对于每一个表(table)或者分,Hive 可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive 也是针对某一列进行桶的组织。Hive 采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

默认是不开启,需要自己手动设定,分成几桶也是自己设定,分成几桶底层就划分几个reducetask,

分桶的实质是对表中已经存在的字段进行划分,插入语句比较特殊,用insert+select语句。

分桶主要的优点,在多表联查的时候,join查询会根据笛卡尔积原则,当数据量大的时候,就会大大的影响效率,分桶之后,相同字段不同内容分桶就会把这个问题解决

10.Load

我们把结构化数据与表进行映射需要load操作,但是注意如果数据在hdfs上用load是把数据移动到指定的hdfs建表文件夹下,如果是在结构化数据Linux下,我们load操作会复制到指定的hdfs建表文件夹下

但是外部表可以不用移动/复制结构化数据,因为在创建外部表的时候就指定了结构化数据的地址,还不会再删除表的时候仅仅删除对应表数据,不会删除hdfs的文件,所以在实际开发过程中用外部表的情况更多。

11.Insert

Hive 中 insert 主要是结合 select 查询语句使用,将查询结果插入到表中

Insert还可以用来动态分区,多重插入,我们的表分区也可以是动态的,用一个表查询的结果做为另一个表分区的插入,例如:INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...)select_statement FROM from_statement

导出表数据,insert可用来导出表的数据到hdfs也可以到出到本地Linux上。

12 hive的自定义函数UDF

Hive自己有一些函数用草操作字段与数据,我们直接调用即可,可网上搜索hive函数,这里不做说明,那么有时hive自带函数不能解决问题的时候就需要我们自定义函数UDF来解决。

自定义函数编程流程:

12.1 新建java maven项目,添加依赖,写一个 java 类,继承UDF,并重载evaluate方法

12.2 打成 jar 包上传到服务器

12.3 将 jar 包添加到 hive 的 classpath 运行命令:hive>add JAR /home/hadoop/udf.jar;

12.4 创建临时函数与开发好的 java class 关联

12.5 即可在 hql 中使用自定义的函数

猜你喜欢

转载自blog.csdn.net/jinyusheng_1991/article/details/82820517