hive调优部分直接

表的层面调优
1.1 利用分区表优化
分区表 是在某一个或者几个维度上对数据进行分类存储,一个分区对应一个目录。如果筛选条件里有分区字段,那么 Hive 只需要遍历对应分区目录下的文件即可,不需要遍历全局数据,使得处理的数据量大大减少,从而提高查询效率。

也就是说:当一个 Hive 表的查询大多数情况下,会根据某一个字段进行筛选时,那么非常适合创建为分区表,该字段即为分区字段。

CREATE TABLE page_view
(viewTime INT, 
 userid BIGINT,
 page_url STRING, 
 referrer_url STRING,
 ip STRING COMMENT 'IP Address of the User')
PARTITIONED BY(date STRING, country STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '1'
STORED AS TEXTFILE;
1 当你意识到一个字段经常用来做where,建分区表,使用这个字段当做分区字段。如按天过滤、按天分区
2 在查询的时候,使用分区字段来过滤,就可以避免全表扫描。只需要扫描这张表的一个分区的数据即可。分区表设计模式的本质是为了过滤数据避免全表扫描


1.2 利用分桶表优化
跟分区的概念很相似,都是把数据分成多个不同的类别

1、分区:按照字段值来进行,一个分区,就只是包含这个值的所有记录

当前分区的数据不一定不在当前分区

当前分区只会包含当前这个分区值的数据

2、分桶:默认规则,Hash的方式

一个桶中会有多个不同的值

如果一个分桶中,包含了某个值,则这个值的所有记录,必然都在这个分桶里面

Hive Bucket,分桶,指将数据以指定列的值为key进行hash,hash到指定数目的桶里面,这样做的目的和分区表类似,筛选时不用全局遍历所有的数据,只需要遍历所在的桶,这样可以支持高效采样。

最主要的作用就是采样和join

以 userid 这一列为 bucket 的依据,共设置 32 个 buckets

CREATE TABLE page_view(viewTime INT, userid BIGINT,
         page_url STRING, referrer_url STRING,
         ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
CLUSTERED BY(userid): 按照userid进行分桶

SORTED BY(viewTime): 按照viewTime进行桶内排序

INTO 32 BUCKETS: 分成多少个桶

两个表以相同方式(相同字段)划分桶,两个表的桶个数一定是倍数关系,join的时候速度会大大增加

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值