ITqingliang 2018-08-07
工作中,有些时候总感觉对某个概念,某项技术理解的不够深,理解的不到位,其实是自己站的高度不够高。在考虑技术细节和业务结合使用时,也要多想想设计的初衷,多想想为什么,收获颇丰。
一.认识hive
hive一个数据仓库工具,不同于数据库。数据仓库注重于数据分析(OLAP)和历史数据存储,面向主题,而数据库则是面向事务(OLTP),存储
在线交易数据,数据库设计尽量避免冗余,而数据仓库的设计有意引入冗余。
1.面向主题和面向事务
面向主题简单理解是面向某一类信息,面向事务偏重的数据的完整性。如:
商品id,商品名称,商品价格,交易时间,交易数量,交易金额。
在这样的一条交易数据中,面向事务侧重整条交易数据的完整性,而在面向主题的概览中,将信息按主题分类:
商品类:
商品id
商品名称
商品价格
交易类:
交易时间
交易数量
交易金额
2.关于冗余数据
如下的数据库设计是为了避免冗余:
有一个学生班主任表字段如下(班主任和学生的关系是1:N)
学生ID 学生姓名 班主任ID 班主任姓名 班主任家庭住址
那么这里,我们每插入一条学生记录,都必须要插入一次班主任的姓名和家庭住址信息,这就是典型的数据冗余。
这样的冗余带来的麻烦就是:
1。班主任姓名和住址要多次插入同样数据,存在插入错误的危险。
2。班主任搬家了。。。那么要更新班主任家庭住址N次~
为避免冗余:
表拆分为
学生班主任表
学生ID 学生姓名 班主任ID
班主任表
班主任ID 班主任姓名 班主任住址
但是在数据仓库中,设计冗余的目的是以空间换时间,减少关联的开销和提高数据读取的速度。
二.关于hive数据类型的思考
hive数据类型分两大类:一是基本数据类型,二是负载类型。
基本有如tinyint,smallint,int.....(不列举全部),在大部分情况下,设计数据表的时候,都能够正常完成。但是却少有考虑数据类型
对查询性能的影响。比如在定义“员工信息”表时,将员工年龄定义为int类型,并没有任何语法语义错误。但是从查询性能上来考量有瑕疵,这是因为采用int类型存储数据占用的数据表空间比用smallint或tinyint存储占用空间更大,查询时要消耗更多的磁盘IO,在数据集很大的时候,会对查询性能有一定的影响。另外如果hive对某列建立索引,该列的值越短越好,这样可以 提高查询性能,对索引处理会更快。
三.hive三观
树立这些观念有助于更好的利用hive的特点和优势。
1.数据仓库观
hive是数据仓库工具,数据仓库与数据库密不可分,不关注细节。我们可以偏见地像对待数据库一样简单粗暴地对待hive。
在hive里我们可以像操作数据库一样来操作它。
1-1.常见的数据模型操作(SQL):数据库,表,视图,索引,分区,桶
1-2.访问方式:Client(JAVA APT通过thrift server访问),cli(命令行),web ui(直观方便)。
1-3.内置的操作符和函数。
1-4.hive数据文件的存放及元数据信息的管理
2.MapReduce观
2-1.绝大多数hiveQL都是别转换成MR执行的,因此要树立的一种观念是HQL就是MR,在进行Hive调优的时候,很多时候其实都是对MR调优。比如要考虑数据倾斜问题会对MR造成的影响。基于MR的特性,我们可以预见的是hive适合处理大数据量的离线分析,
而且是冷数据(只读不写)。具有高延迟的特点,不适合低延迟快速响应的场合。
2-2.hive的元数据是和很多hadoop组件共享的,比如和impala,Hbase共享元数据。对hive数据的操作同样会影响其他组件的数据。
3.高扩展性观
有些时候,hive自带的函数不能满足实际开发需求,我们可以通过自定义UDF来扩展hive的功能,还可以通过改动一些底层
源码来实现想要的功能。而这些改动都是基于Java,所以改动的成本低,易于编程。类似于ETL工具Sqoop。比如自定义输入输出格式化处理,自定义分隔符处理程序,自定义业务逻辑处理过程等等,这极大的丰富和扩展了hive的功能