设为首页 加入收藏

TOP

Hive的原理(一)
2019-09-17 18:38:04 】 浏览:69
Tags:Hive 原理

阅读目录

 

一、Hive内部表和外部表

0、Hive是什么?

Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再Hadoop平台上运行,达到快速开发的目的。

Hive中的表是纯逻辑表,就只是表的定义等,即表的元数据。本质就是Hadoop的目录/文件,达到了元数据与数据存储分离的目的

Hive本身不存储数据,它完全依赖HDFS和MapReduce.。

Hive的内容是读多写少,不支持对数据的改写和删除

Hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:

--  列分隔符

--  行分隔符

-- 读取文件数据的方法

1、Hive的create创建表的时候,选择的创建方式:

- create table

- create external table

2、特点:

● 在导入数据到外部表,数据并没有移动到自己的数据仓库目录下,也就是说外部表中的数据并不是由它自己来管理的!而表则不一样;

● 在删除表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!

注意:

1、- create table 创建内部表,create external table 创建外部表

2、建议在工作中用外部表来创建

二、Hive中的Partition

●  在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都储存在对应的目录中

– 例如:pvs 表中包含 ds 和 city 两个 Partition,则
– 对应于 ds = 20090801, ctry = US 的 HDFS 子目录为:/wh/pvs/ds=20090801/ctry=US;
– 对应于 ds = 20090801, ctry = CA 的 HDFS 子目录为;/wh/pvs/ds=20090801/ctry=CA

●  Partition是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照一定的规格和条件进行管理。

三、Hive中的 Bucket

? hive中table可以拆分成partition,table和partition可以通过‘CLUSTERED BY
’进一步分bucket,bucket中的数据可以通过‘SORT BY’排序。
? 'set hive.enforce.bucketing = true' 可以自动控制上一轮reduce的数量从而适
配bucket的个数,当然,用户也可以自主设置mapred.reduce.tasks去适配
bucket个数

? Bucket主要作用:
– 数据sampling,随机采样
– 提升某些查询操作效率,例如mapside join

? 查看sampling数据:
– hive> select * from student tablesample(bucket 1 out of 2 on id);
– tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)
– y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了64份,当y=32
时,抽取(64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。x表示从哪个bucket开始抽
取。例如,table总bucket数为32,tablesample(bucket 3 out of 16),表示总共抽取(32/16=)2个bucket的数据
,分别为第3个bucket和第(3+16=)19个bucket的数据

四、Hive数据类型

1、原生类型

– 原生类型
? TINYINT
? SMALLINT
? INT
? BIGINT
? BOOLEAN
? FLOAT
? DOUBLE
? STRING
? BINARY(Hive 0.8.0以上才可用)
? TIMESTAMP(Hive 0.8.0以上才可用)

2、复合类型

– 复合类型
? Arrays:ARRAY<data_type>
? Maps:MAP<primitive_type, data_type>   ##复合类型
? Structs:STRUCT<col_name: data_type[COMMENT col_comment],……>
? Union:UNIONTYPE<data_type, data_type,……>

五、Hive SQL — — Join in MR

INSERT OVERWRITE TABLE pv_users
SELECT pv.pageid, u.age
FROM page_view pv
JOIN user u
ON (pv.userid = u.userid);
SELECT pageid, age, count(1)
FROM pv_users
GROUP BY pageid, age;

六、Hive的优化

? Map的优化:

– 作业会通过input的目录产生一个或者多个map任务。set dfs.block.size
– Map越多越好吗?是不是保证每个map处理接近文件块的大小?
– 如何合并小文件,减少map数?

set mapred.max.split.size=100000000;    #100M 
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

– 如何适当的增加map数?

set mapred.map.tasks=10;

– Map端聚合 hive.map.aggr=true 。 Mr中的Combiners.

 

? Reduce的优化:

? Reduce的优化:
– hive.exec.reducers.bytes.per.reducer;reduce任务处理的数据量
– 调整reduce的个数: ? 设置reduce处理的数据量 ? set mapred.reduce.tasks
=10
select pt,count(1)
from popt_tbaccountcopy_mes
where pt = '2012-07-04' group by pt;
写成
select count(1)
from popt_tbaccountcopy_mes
where pt = '2012-07-04';
Set mapred.reduce.tasks = 100
Create table a_standby_table as select * from a distribute by XXX

? 分区裁剪优化(partition):

– Where中的分区条件,会提前生效,不必特意做子查询,直接Join和GroupBy

? 笛卡尔积:

– join的时候不加on条件或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积

? Map join:

– /*+ MAPJOIN
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇如何购买并配置linux服务器上的数.. 下一篇MySQL读取Binlog日志常见的3种错误

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目