HIVE

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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值