1.什么是Hive
hive是基于Hadoop的一个数据仓库,可以把储存在hdfs里的文件变成传统型关系数据库的表的形式展现出来,可以使用类SQL 语言对表进行清洗计算得到自己想要的结果,hive的计算是基于Hadoop的MapReduce,hive的储存是基于Hadoop的HDFS。
2.HIVE和传统关系型数据库的区别
hive的操作方式和传统关系型数据库差别不大,使用类SQL语言就可以了,但是他们底层的原理不一样,hive底层是把类SQL转换成MapReduce,所以速度上来说会慢很多,不能做到实时查寻。
表类型
1.外部表
外部表特点是先有数据再有表,删除外部表时表数据不会被删除
2.内部表
内部表特点是先有表再有数据,删除内部表时数据也会被删除
3.分区表
内部表可以是分区表,外部表也可以是分区表
分区表的作用是可以通过指定的字段提高查询效率,在数据量较大的时候可以避免全表查询
4.分桶表
外部表不能是分桶表,分桶表都是内部表,分区表也可以是分桶表
分桶表的作用主要是为了实现数据的抽样,方便进行测试
分桶表还可以用于大表join大表,把两张大表分成多个小表,让小表之间join,避免数据倾斜
内置函数
Hive除了实现了标准的SQL,为了提升数据的处理能力,还额外提供了很多内置函数,可以直接使用,虽然不是sql原生的语法,但是大大增强了Hive处理数据的能力,是Hive的重要组成部分。
1.数学函数
2.类型转换函数
3.日期函数
4.条件函数
5.字符串函数
6.聚合函数
UDF
UDF是自定义函数,可以通过继承UDF来自定义函数,增强Hive的可扩展性
HIVE的优化
Hive的优化一般是解决数据倾斜和小文件的问题
1.map side join
当大表join小表时,可以把小表缓存如内存中,避免shuffle
设置方式:set hive.auto.convert.join=true
2.group by
发生数据倾斜时会自动生成两个job任务,第一个job任务在map端分区时会在key后面加一个随机数,使分区均匀,第二个job任务则把第一个job任务加的随机数去除并从新分区,得到自己想要的结果
设置方式:set Hive.groupby.skewindata=true;
3.count distinct优化
这个优化不是设置上面的优化,而是HQL代码的优化,意思就是count和distinct不能同时使用,使用count这种全聚合函数的时候reduce强制只能有一个,而distinct也只能由reduce完成,这就会导致一个reduce运行压力很大,需要把count,distinct分开,先进行distinct,只是distinct的话就可以有多个reduce,不会造成单个reduce的尴尬,而distinct之后数据量也会变小,就算count只能有一个reduce也会比原来快很多。
4.jvm重用
每个maptask和reducetask都会启动一个jvm虚拟机,执行完后就关闭,这个时候如果切片数量或者分区数量多的话就会产生大量的map task,reduce task,就会造成大量的jvm的创建和销毁,造成资源浪费。
设置方式:set mapred.job.reuse.jvm.num.tasks=20(默认是一个,二十的意思是执行完二十个任务jvm才会关闭)
5.设置切片数
主要是解决小文件问题,如果有大量小文件,每个文件都会产生一个切片,一个切片对应一个maptask,这样就会产生大量的map task
设置方式:set mapred.max.split.size=134217728(这是字节数,默认128M)