-
hive学习笔记之五:分桶
本篇概览
本文是《hive学习笔记》的第五篇,前文学习了分区表,很容易发现分区表的问题:
- 分区字段的每个值都会创建一个文件夹,值越多文件夹越多;
-
不合理的分区会导致有的文件夹下数据过多,有的过少;
此时可以考虑分桶的方式来分解数据集,分桶原理可以参考MR中的HashPartitioner,将指定字段的值做hash后,根据桶的数量确定该记录放在哪个桶中,另外,在join查询和数据取样时,分桶都能提升查询效率;
- 接下来开始实战;
配置
- 执行以下设置,使得hive根据桶的数量自动调整上一轮reducers数量:
set hive.enforce.bucketing = true;
- 如果不执行上述设置,您需要自行设置mapred.reduce.tasks参数,以控制reducers数量,本文咱们配置为hive自动调整;
准备数据
接下来先准备外部表t13,往里面添加一些数据,将t13作为后面分桶表的数据源:
- 表名t13,只有四个字段:
create external table t13 (name string, age int, province string, city string)
row format delimited
fields terminated by ','
location '/data/external_t13';
- 创建名为013.txt的文件,内容如下:
tom,11,guangdong,guangzhou
jerry,12,guangdong,shenzhen
tony,13,shanxi,xian
john,14,shanxi,hanzhong
- 将013.txt中的四条记录载入t13:
load data
local inpath '/home/hadoop/temp/202010/25/013.txt'
into table t13;
分桶
- 创建表t14,指定字段分桶,桶数量为16:
create table t14 (name string, age int, province string, city string)
clustered by (province, city) into 16 buckets
row format delimited
fields terminated by ',';
- 从t13导入数据,注意语法是from t13开始,要用overwrite关键字:
from t13
insert overwrite table t14
select name, age, province, city;
- 导入过程如下图所示,可见reducer数量已被自动调整为桶数量:
- 导入后,查看hdfs,可见被分为16个文件,(和分区对比一下,分区是不同的文件夹):
取样
执行以下语句,取样查看t14的数据:
hive> select * from t14 tablesample(bucket 1 out of 2 on province, city);
OK
tom 11 guangdong guangzhou
john 14 shanxi hanzhong
Time taken: 0.114 seconds, Fetched: 2 row(s)
- 至此,分桶操作就完成了,基础知识的实践已经完成,接下来开始一些进阶实践;
出处:https://www.cnblogs.com/bolingcavalry/p/14965877.html
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
数据库审计与智能监控:从日志分析到异
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比