最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

[Hive] 初步认识Hive

[复制链接]
跳转到指定楼层
楼主
发表于 2017-12-18 10:28:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
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,cOUBLE>
)

类型转化
  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 查询语句类似,运行结果如下所示。

 
[AppleScript] 纯文本查看 复制代码
[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 命令,表示命令在后台运行。
  
[AppleScript] 纯文本查看 复制代码
 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 命令如下。
  
[AppleScript] 纯文本查看 复制代码
 Hive  --service Hiveserver2 &      //默认端口10000
  Hive --service Hiveserver2 --Hiveconf Hive.server2.thrift.port 10002 & //可以通过命令行直接将端口号改为10002


  Hive的远程服务端口号也可以在Hive-default.xml文件中配置,修改Hive.server2.thrift.port对应的值即可。
[AppleScript] 纯文本查看 复制代码
< 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 类似,如下所示。
[AppleScript] 纯文本查看 复制代码
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的数据库与目录对应关系
[AppleScript] 纯文本查看 复制代码
hive> show databases;
OK
default

若是自己新建一个数据库,如lesson1
[AppleScript] 纯文本查看 复制代码
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. 表的文本编码分割符
1
2
3
4
5
6
7
8
9
10
11
12
13


CREATE TABLE employees (
name  STRING,
salary  FLOAT,
subordinates ARRAY<STRING>,
deductions  MAP<STRING, FLOAT>,
address  STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
​ROW FORMAT DELIMITED
FIELDS TERMINATED BY '01'
COLLECTION ITEMS TERMINATED BY '02'
MAP KEYS TERMINATED BY '03'
LINES TERMINATED BY 'n'
STORED AS TEXTFILE;




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

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


Bill  King^A60000.0^AFederal  Taxes^C.15^BState  Taxes^C.03^BInsurance^C.1^A300 Obscure Dr.^BObscuria^BIL^B60100




  所以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

   
  作者:大数据躺过的坑
  目前研究领域:大数据、机器学习、深度学习、人工智能、数据挖掘、数据分析。 语言涉及:Java、Scala、Python、Shell、Linux等 。同时还涉及平常所使用的手机、电脑和互联网上的使用技巧、问题和实用软件。
出处:http://www.cnblogs.com/zlslch/





楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-4-29 11:18

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表