Hive整理

Hive产生的原因:


    – 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一堆MapReduce代码
    – 对于统计任务,只能由懂MapReduce的程序员才能搞定
    – 耗时耗力,更多精力没有有效的释放出来

Hive介绍:


Hive基于一个统一的查询分析层,通过SQL语句的方式对HDFS上的数据进行查询、统计和分析。
• Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快
  速开发的目的。
• Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。本质就是Hadoop的目录/文件,
  达到了元数据与数据存储分离的目的
• Hive本身不存储数据,它完全依赖HDFS和MapReduce。
• Hive的内容是读多写少,不支持对数据的改写和删除
• Hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:
    – 列分隔符 空格,‘,’ ‘\t’
    – 行分隔符’\n’
    – 读取文件数据的方法

与传统数据库比较:


• hive和关系数据库存储文件的系统不同,hive使用的是hadoop的HDFS(hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统;
• hive使用的计算模型是mapreduce,而关系数据库则是自己设计的计算模型;
• 关系数据库都是为实时查询的业务进行设计的,而hive则是为海量数据做数据挖掘设计的,实时
  性很差
• Hive很容易扩展自己的存储能力和计算能力

 

hive结构图: 

用户接口:
  CLI:启动的时候,会同时启动一个 Hive 副本
  JDBC:Hive 的客户端,用户连接至 Hive Serve
  WUI:通过浏览器访问Hive

语句转换
  解析器:生成抽象语法树
  语法分析器:验证查询语句
  逻辑计划生成器(包括优化器):生成操作符树
  查询计划生成器:转换为map-reduce任务
 
数据存储:
  Hive数据以文件形式存储在HDFS的指定目录下
  Hive语句生成查询计划,由MapReduce调用执行

Hive架构图:

 

 Hive数据管理


hive的表本质就是Hadoop的目录/文件,hive默认表存放路径一般都是在工作目录的hive目录里面,按表名做文件夹分开
 

内部表和外部表


• Hive的create创建表的时候,选择的创建方式:
– create table 内部表
– create external table location ‘hdfs_path’ 外部表 (文件)

特点:
  1.导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它
    自己来管理的!而内部表则不一样;
  2.在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除
    外部表的元数据,数据是不会删除的;

使用示例:一句话实现WordCount

创建内部表:

create table article(sentence string) row format delimited fields terminated by '\n';

从本地导入数据
load data local inpath '/home/app/data/test.txt' overwrite into table article;

实现word count    走的是mapreduce计算框架  
select word, count(*)
from ( 
select 
explode (split(sentence,' ')) 
as word 
from article
) t
group by word

 test.txt的内容就是这样一篇文章:

 

Hive中的Partition和Bucket

 

Partition

随着系统运行时间增长,表的数据量越来越大,而hive查询时通常是是全表扫描,这样将导致大量的不必要的数据扫描,从而大大减低查询效率
从而引进分区技术,使用分区技术,避免hive全表扫描,提升查询效率。
 在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的
数据都存储在对应的目录中
– 例如:pvs 表中包含 ds 和 city 两个 Partition,则
– 对应于 ds = 20090801, city = US 的 HDFS 子目录为:/wh/pvs/ds=20090801/ctry=US;
– 对应于 ds = 20090801, city = CA 的 HDFS 子目录为;/wh/pvs/ds=20090801/ctry=CA
• partition是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照一定的规格和条件进行管理

Bucket

hive中table可以拆分成partition,table和partition可以通过‘CLUSTERED BY’进一步分bucket,bucket中的数据可以通过‘SORT BY’排序。
• create table bucket_user (id int,name string)clustered by (id) into 4 buckets;
• ‘set hive.enforce.bucketing = true’ 可以自动控制上一轮reduce的数量从而适配bucket的个数,当然,用户也可以自主设置  mapred.reduce.tasks去适配bucket个数

Bucket主要作用:
1.数据sampling(采样)
2.提升某些查询操作效率,例如mapside join

 

Hive数据优化

数据倾斜问题--大小表关联

• Hive在进行join时,按照join的key进行分发,而在join左边的表的数据会首先读入内存,如果左边表的key相对分散,读入内存的数据会比较小,join任务执行会比较快;而如果左边的表key比较集中,而这张表的数据量很大, 那么数据倾斜就会比较严重,而如果这张表是小表,则还是应该把这张表放在join左边。

• 思路

将key相对分散,并且数据量小的表放在join的左边这样可以有效减少内存溢出错误发生的几率 • 使用map join让小的维度表先进内存。

• 方法

 small_table join big_table 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值