初步认识Hive

简介:

Hive是构建在hadoop之上的数据仓库。不是用来增删改查的那种数据库,那是数据库。

  1)数据计算是MapReduce

  2)数据存储是HDFS 

 

 

认识 Hive

       Hive 是基于 Hadoop 构建的一套数据仓库分析系统,它提供了丰富的 SQL 查询方式来分析存储在 Hadoop  分布式文件系统中的数据, 可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运行,通过自己的 SQL 去 查询分析需要的内容,这套 SQL 简称 Hive SQL,使不熟悉 MapReduce 的用户很方便地利用 SQL 语言查询、汇总、分析。核心仍然是mapreduce作业

 

 

Hive常见的应用场景

  1、日志分析

      1)统计网站一个时间段内的pv、uv

      2)从不同维度进行数据分析

  2、海量结构化数据离线分析

 

 

Hive的优点

  1、简单容易入手

  2、它是为超大数据集而设计的计算和扩展能力

  3、提供统一的元数据管理

 

 

Hive的缺点

  1、Hive的HQL的表达能力有限

      1)迭代式算法无法表达,比如pagerank。

      2)数据挖掘方面,比如kmeans。

  2、Hive的效率比较低

      1)hive自动生成的MapReduce作业,通常情况下不够智能化。

      2)hive调优比较困难

      3)hive可控性比较差

 

 

 

Hive的基本框架

  

 

  

  

 

 

 

 

Hive的组成部分

  1、用户接口

       CLI、JDBC/ODBC、WebUI

  2、元数据存储(MetaStore)

       默认derby数据库,真实环境一般使用mysql数据库

  3、驱动器(Driver)

       解释器、编译器、优化器、执行器

  4、hadoop分布式集群

      利用MapReducer分布式计算,利用HDFS分布式存储

 

 

 

Hive工作原理

  

  MapReduce 开发人员可以把自己写的 Mapper 和 Reducer 作为插件支持 Hive 做更复杂的数据分析。 它与关系型数据库的 SQL 略有不同,但支持了绝大多数的语句(如 DDL、DML)以及常见的聚合函数、连接查询、条件查询等操作。

  具体见

Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)(非常好)

  Hive 不适合用于联机(online) 事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive 的特点是可 伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输入格式的松散耦合。Hive 的入口是DRIVER ,执行的 SQL 语句首先提交到 DRIVER 驱动,然后调用 COMPILER 解释驱动, 最终解释成 MapReduce 任务执行,最后将结果返回。

 

 

 

Hive 数据类型

  Hive 提供了基本数据类型和复杂数据类型,复杂数据类型是 Java 语言所不具有的。下面介绍 Hive 的两种数据类型以及数据类型之间的转换。

  由上表我们看到Hive不支持日期类型,在Hive里日期都是用字符串来表示的,而常用的日期格式转化操作则是通过自定义函数进行操作。

 

  Hive是用java开发的,Hive里的基本数据类型和java的基本数据类型也是一一对应的,除了string类型。有符号的整数类型:TINYINT、SMALLINT、INT和BIGINT分别等价于java的byte、short、int和long原子类型,它们分别为1字节、2字节、4字节和8字节有符号整数。Hive的浮点数据类型FLOAT和DOUBLE,对应于java的基本类型float和double类型。而Hive的BOOLEAN类型相当于java的基本数据类型boolean。

  对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

 

 

复杂数据类型

  

  Hive 有三种复杂数据类型 ARRAY、MAP 和 STRUCT。ARRAY 和 MAP 与 Java 中的 Array 和 Map 类似,而STRUCT 与 C语言中的 Struct 类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

  复杂数据类型的声明必须使用尖括号指明其中数据字段的类型。定义三列,每列对应一种复杂的数据类型,如下所示。

CREATE TABLE complex(

         col1 ARRAY< INT>,

         col2 MAP< STRING,INT>,

         col3 STRUCT< a:STRING,b:INT,c:DOUBLE>

)

 

 

 

类型转化

  Hive 的原子数据类型是可以进行隐式转换的,类似于 Java 的类型转换,例如某表达式使用 INT 类型,TINYINT 会自动转换为 INT 类型, 但是 Hive 不会进行反向转化,例如,某表达式使用 TINYINT 类型,INT 不会自动转换为 TINYINT 类型,它会返回错误,除非使用 CAST 操作。

隐式类型转换规则如下。

     1、任何整数类型都可以隐式地转换为一个范围更广的类型,如 TINYINT 可以转换成 INT,INT 可以转换成 BIGINT。

     2、所有整数类型、FLOAT 和 String 类型都可以隐式地转换成 DOUBLE。

     3、TINYINT、SMALLINT、INT 都可以转换为 FLOAT。

     4、BOOLEAN 类型不可以转换为任何其它的类型。

     可以使用 CAST 操作显示进行数据类型转换,例如 CAST('1' AS INT) 将把字符串'1' 转换成整数 1;如果强制类型转换失败,如执行 CAST('X' AS INT),表达式返回空值 NULL。

 

 

 

Hve安装部署-实验环境

  

 

  Hive其实很简单,它只有一个server,并不是分布式系统。就是单节点,我们部署在一个节点上就可以了。上述的是在测试环境中。

 

 

 

 

Hve安装部署-真实环境

   

 

 

 

用户接口

  Hive 对外提供了三种服务模式,即 Hive 命令行模式(CLIHive 的 Web 模式(WUIHive 的远程服务(Client。下面介绍这些服务的用法。

  1、 Hive 命令行模式

  Hive 命令行模式启动有两种方式。执行这条命令的前提是要配置 Hive 的环境变量。

  1)       进入 /home/hadoop/app/Hive 目录,执行如下命令。

 ./Hive

 

  2)       直接执行命令。

Hive --service cli

 

 

  Hive 命令行模式用于 Linux 平台命令行查询,查询语句基本跟 MySQL 查询语句类似,运行结果如下所示。

复制代码
 [hadoop@zhouls Hive]$ Hive
  Hive> show tables;
  OK
  stock
  stock_partition
  tst
  Time taken: 1.088 seconds, Fetched: 3 row(s)
  Hive> select * from tst;
  OK
  Time taken: 0.934 seconds
  Hive> exit;
  [hadoop@zhouls Hive]$
复制代码

 



  2、Hive Web 模式

  Hive Web 界面的启动命令如下。

Hive --service hwi

  通过浏览器访问 Hive,默认端口为 9999。

 

  3、 Hive 的远程服务

  远程服务(默认端口号 10000)启动方式命令如下,“nohup...&” 是 Linux 命令,表示命令在后台运行。

  nohup Hive --service Hiveserver &  //在Hive 0.11.0版本之前,只有HiveServer服务可用
  nohup Hive --service Hiveserver2 & //在Hive 0.11.0版本之后,提供了HiveServer2服务

 

 

  Hive 远程服务通过 JDBC 等访问来连接 Hive ,这是程序员最需要的方式。

  这里,我是安装的是Hive1.0版本,所以启动 Hive service 命令如下。

  Hive  --service Hiveserver2 &      //默认端口10000
  Hive --service Hiveserver2 --Hiveconf Hive.server2.thrift.port 10002 & //可以通过命令行直接将端口号改为10002

 

  Hive的远程服务端口号也可以在Hive-default.xml文件中配置,修改Hive.server2.thrift.port对应的值即可。

< property>
    < name>Hive.server2.thrift.port< /name>
    < value>10000< /value>
    < description>Port number of HiveServer2 Thrift interface when Hive.server2.transport.mode is 'binary'.< /description>
< /property>

 

      
          


Hive 的 JDBC 连接和 MySQL 类似,如下所示。

 

复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class HiveJdbcClient {
         private static String driverName = "org.apache.Hive.jdbc.HiveDriver";//Hive驱动名称  Hive0.11.0之后的版本
         //private static String driverName = "org.apache.hadoop.Hive.jdbc.HiveDriver";//Hive驱动名称  Hive0.11.0之前的版本
         public static  void main(String[] args) throws SQLException {
                 try{
                          Class.forName(driverName);
                 }catch(ClassNotFoundException e){
                          e.printStackTrace();
                          System.exit(1);
                 }
                 //第一个参数:jdbc:Hive://zhouls:10000/default  连接Hive2服务的连接地址
                 //第二个参数:hadoop  对HDFS有操作权限的用户
                 //第三个参数:Hive  用户密码  在非安全模式下,指定一个用户运行查询,忽略密码
                 Connection con = DriverManager.getConnection("jdbc:Hive://zhouls:10000/default", "hadoop", "");
                 System.out.print(con.getClientInfo());
         }
}
复制代码

 

 

 

 

 

 

解释器、编译器、优化器

  Driver 调用解释器(Compiler)处理 HiveQL 字串,这些字串可能是一条 DDL、DML或查询语句。编译器将字符串转化为策略(plan)。策略仅由元数据操作 和 HDFS 操作组成,元数据操作只包含 DDL 语句,HDFS 操作只包含 LOAD 语句。对插入和查询而言,策略由 MapReduce 任务中的具有方向的非循环图(directedacyclic graph,DAG)组成,具体流程如下。

  1)解析器(parser):将查询字符串转化为解析树表达式。

  2)语义分析器(semantic analyzer):将解析树表达式转换为基于块(block-based)的内部查询表达式,将输入表的模式(schema)信息从 metastore 中进行恢复。用这些信息验证列名, 展开 SELECT * 以及类型检查(固定类型转换也包含在此检查中)。

  3)逻辑策略生成器(logical plan generator):将内部查询表达式转换为逻辑策略,这些策略由逻辑操作树组成。

  4)优化器(optimizer):通过逻辑策略构造多途径并以不同方式重写。

 

优化器的功能如下:

  将多 multiple join 合并为一个 multi-way join;

  对join、group-by 和自定义的 map-reduce 操作重新进行划分;

  消减不必要的列;

  在表扫描操作中推行使用断言(predicate);

  对于已分区的表,消减不必要的分区;

  在抽样(sampling)查询中,消减不必要的桶。此外,优化器还能增加局部聚合操作用于处理大分组聚合(grouped aggregations)和 增加再分区操作用于处理不对称(skew)的分组聚合。

 

 

 

Hive的数据库与目录对应关系

hive> show databases;
OK
default

  对应hdfd目录上是,/user/hive/metastore

 

若是自己新建一个数据库,如lesson1

hive> create  database lesson1;

hive> describe  database extended lesson1;

  对应hdfd目录上是,/user/hive/metastore/lesson1.db/

  然后在这个数据库下,新建表。这里不多赘述啦

 

 

 

 

 Hive中的数据组织形式

 

 

 

 

Hive的Metastore

 

 

 

Hive点滴 – 数据类型

http://debugo.com/hive-datatype/  

7. 复合类型

  复合类型在关系数据库中不曾提供,因为这些类型破坏了关系数据库的范式规则。
  arrays: ARRAY<data_type> 定义数组需要指定数组的类型,数组中每一个元素都有相同的类型。访问数组中的元素使用下标访问。
  maps: MAP<primitive_type, data_type> 一组键值对组成的元组,其中的值可以通过[‘KEY’]来访问。例如name的内容是map(‘first’, ‘John’, ‘last’, ‘Doe’) ,那么第一个元组是name[‘first’]。
  structs: STRUCT<col_name : data_type [COMMENT col_comment], …> 类似于C语言的struct。struct内的元素可以通过”.”来访问。例如STRUCT {first STRING; last STRING}, first则可以用name.frist来访问。
  union: UNIONTYPE<data_type, data_type, …> 从0.7.0开始提供。UNION类型可以如下定义,可以包含若干个任意其他类型:
CREATE TABLE union_test(foo UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>);

 

 

 

8. 表的文本编码分割符

 

 

Hive数据类型的文本编码:
hive的数据文件使用几种默认分割符来分割:
    记录分割符“n”    分割记录,即每一行就是一个记录
    域分割符 “^A”或八进制01    分割各个字段
    集合元素类型分割符 “^B”或八进制02    分割struct、分割array和map中的key-value pairs
    map键值分割符 “^C”或八进制03    分割map中的键和值

 


例如上面的表中的数据可能是:

 

  所以CSV文件的外部表定义可以是:ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,';

 

 

 

 

Hive服务

Hive Server和Hive server2都是一种远程服务。

   前3项已经属于老的用法了,现在都用后2项。即,Hive Server2和Hive Metastore Server 。

   更详细,见http://debugo.com/hive-cmd/  。

 

 

 

 

 Hive QL之DDL和DML

 

 

 

 

 

内部表和外部表

 

  注意,指定多个分区时,hdfs上存储目录按照分区创建顺序形成树形结构。

 

 

 

 

 

 

 

 

文件数据导入表LOAD

 

 


本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5659714.html,如需转载请自行联系原作者

 

相关文章
|
5月前
|
SQL 存储 分布式计算
hive解决了什么问题
hive解决了什么问题
41 0
|
7月前
|
SQL Java 数据库连接
|
9月前
|
SQL 存储 分布式计算
HIVE初识
什么是HiveHive是建立在Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载,可以简称为ETL。
58 1
|
10月前
|
SQL 存储 分布式计算
Hive小结1
Hive小结
71 1
|
10月前
|
SQL 存储 分布式计算
Hive小结2
Hive小结2
94 0
|
11月前
|
SQL 分布式计算 大数据
Hive 到底有什么用?
MapReduce简化大数据编程难度,但对经常需大数据计算的人,如从事研究BI的数据分析师,他们通常使用SQL进行大数据分析和统计,MapReduce编程还是有门槛。且若每次统计和分析都开发相应MapReduce程序,成本确实太高。
78 0
Hive中not in的正确使用
Hive中not in的正确使用
Hive中not in的正确使用
|
SQL 存储 分布式计算
【Hive】(一)Hive 入门
【Hive】(一)Hive 入门
308 0
【Hive】(一)Hive 入门
|
SQL 存储 数据采集
【Hive】(七)Hive 查询使用详解2
【Hive】(七)Hive 查询使用详解2
168 0
【Hive】(七)Hive 查询使用详解2
|
SQL 存储 分布式计算
【Hive】(七)Hive 查询使用详解1
【Hive】(七)Hive 查询使用详解1
302 0
【Hive】(七)Hive 查询使用详解1