Hive核心优化

本文详细介绍了Hive中的数据采样技术,包括分桶表的创建、如何向桶表添加数据,以及如何利用分桶表提升查询效率。此外,还探讨了MapJoin、BucketMapJoin和SMBJoin等join优化方法,以及ORC存储格式下的行组索引和BloomFilter索引。文中还针对数据倾斜问题提供了解决方案,如使用SkewJoin和unionall优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据采样

        分桶表概述:

                分桶就是分文件, 在创建表的时候, 指定分桶字段, 并设置分多少个桶, 在添加数据的时候, hive会根据设置分桶字段, 将数据划分到N个桶(文件)中, 默认情况采用HASH分桶方案 , 分多少个桶, 取决于建表的时候, 设置分桶数量, 分了多少个桶最终翻译的MR也就会运行多少个reduce程序(HIVE的分桶本质上就是MR的分区操作)

        如何向桶表添加数据

        创建一个分桶表

create table 表名(
    字段 类型,
    ....
)
clustered by(分桶字段) [sorted by (字段 [asc | desc])] into N buckets   
-- 定义分桶表核心语句
row format......

        添加数据

insert into|overwrite + select 将数据添加到桶表
现有一个文本文件数据, 需要加载到分桶表,如何解决呢? 
   第一步: 基于桶表创建一张临时表, 此表和桶表保持相同字段, 唯一区别, 当前这个表不是一个桶表
   第二步: 将数据先加载到这个临时表中
   第三步: 基于临时表, 使用 insert into|overwrite + select 将数据添加到桶表
注:在CDH中默认开启了一个参数, 是禁止采用load data方式向桶表添加数据的:  set hive.strict.checks.bucketing = true;
        桶表的作用

                1.进行数据采样工作

                    当表的数据量比较庞大的时候, 在编写SQL语句后, 需要首先测试 SQL是否可以正常的执行,  需要在表中执行查询操作, 由于表数据量比较庞大, 在测试一条SQL的时候整个运行的时间比较久, 为了提升测试效率, 可以整个表抽样出一部分的数据, 进行测试
                    校验数据的可行性(质量校验)
                    进行统计分析的时候, 并不需要统计出具体的指标, 可能统计的都是一些相对性指标, 比如说一些比率(合格率)问题, 此时可以通过采样处理

                2.提升查询的效率

                    可以减少JOIN次数, 从而提升效率

        如何采样
采样函数: tablesample(bucket x out of y [on column])
使用位置:紧紧跟在表名的后面, 如果表名有别名, 必须放置别名的前面
说明:
	x: 从第几个桶开始进行采样; 
	y: 抽样比例; column: 分桶的字段, 可以省略
注意:
	1. x 不能大于 y; 
	2. y 必须是表的分桶数量的倍数或者因子
案例:
	1) 假设 A表有10个桶, 请分析, 下面的采样函数, 会将那些桶抽取出来呢?
tables
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值