欢迎访问我的GitHubhttps://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
《hive学习笔记》系列导航
- 基本数据类型
- 复杂数据类型
- 内部表和外部表
- 分区表
- 分桶
- HiveQL基础
- 内置函数
- Sqoop
- 基础UDF
- 用户自定义聚合函数(UDAF)
- UDTF
- 分区字段的每个值都会创建一个文件夹,值越多文件夹越多;
- 不合理的分区会导致有的文件夹下数据过多,有的过少;
此时可以考虑分桶的方式来分解数据集,分桶原理可以参考MR中的HashPartitioner,将指定字段的值做hash后,根据桶的数量确定该记录放在哪个桶中,另外,在join查询和数据取样时,分桶都能提升查询效率;
- 接下来开始实战;
- 执行以下设置,使得hive根据桶的数量自动调整上一轮reducers数量:
set hive.enforce.bucketing = true;- 如果不执行上述设置,您需要自行设置mapred.reduce.tasks参数,以控制reducers数量,本文咱们配置为hive自动调整;
- 表名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,guangzhoujerry,12,guangdong,shenzhentony,13,shanxi,xianjohn,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 bucketsrow format delimited fields terminated by ',';- 从t13导入数据,注意语法是from t13开始,要用overwrite关键字:
from t13insert 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);OKtom 11 guangdong guangzhoujohn 14 shanxi hanzhongTime taken: 0.114 seconds, Fetched: 2 row(s)- 至此,分桶操作就完成了,基础知识的实践已经完成,接下来开始一些进阶实践;
- Java系列
- Spring系列
- Docker系列
- kubernetes系列
- 数据库+中间件系列
- DevOps系列
https://github.com/zq2599/blog_demos
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
