Hive_ 对比分区,分桶
Hive 动态分区
建表时指出分区字段,但不给值,导入数据时 hive 根据分区字段的值自动创建分区。
开启动态分区需要修改一些配置:
是否开启动态分区,默认:false
set hive.exec.dynamic.partition=true;
动态分区模式,默认:strict:严格模式,至少有一个分区列是静态分区
set hive.exec.dynamic.partition.mode=nostrict;
相关参数:
每一个执行 mr 节点上,允许创建的动态分区的最大数量(100)
set hive.exec.max.dynamic.partitions.pernode;
所有执行 mr 节点上,允许创建的所有动态分区的最大数量(1000)
set hive.exec.max.dynamic.partitions;
所有的 mr job 允许创建的文件的最大数量(100000)
set hive.exec.max.created.files;
hive> set hive.exec.dynamic.partition=true;
hive> set hive.exec.dynamic.partition.mode=nostrict;
hive> create table part0 (
id int,
name string
)
PARTITIONED BY (sex string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
hive> desc part0;
col_name data_type comment
id int
name string
sex string
# Partition Information
# col_name data_type comment
sex string
导入两个分区的数据
hive> load data local inpath '/root/part0_data' into table part0 PARTITION (sex='1');
hive> load data local inpath '/root/part0_data' into table part0 PARTITION (sex='2');
hive> select * from part0;
part0.id part0.name part0.sex
1 Jed 1
2 Tom 1
3 Cat 1
1 Jed 2
2 Tom 2
3 Cat 2
创建一个和 part0 表机构完全相同的表 part1
hive> create table part1 like part0;
给 part1 导入数据,使用动态分区
hive> from part0
insert into table part1 partition (sex)
select *;
hive> select * from part1;
part1.id part1.name part1.sex
1 Jed 1
2 Tom 1
3 Cat 1
1 Jed 2
2 Tom 2
3 Cat 2
使用动态分区导入数据时,不使用 load,因为 load 必须指定分区的值,应该使用
from+select 方式。
Hive 分桶
分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。对于 hive 中每一
个表、分区都可以进一步进行分桶。由列的哈希值除以桶的个数来决定每条数据划分在哪
个桶中。比分区更加细粒度。
适用场景:数据抽样( sampling )、map-join
开启分桶支持:
set hive.enforce.bucketing=true;
默认:false。设置为 true 之后,mr 运行时会根据 bucket 的个数自动分配 reduce task
个数。(用户也可以通过 mapred.reduce.tasks 自己设置 reduce 任务个数,但分桶时不推荐
使用)注意:一次作业产生的桶(文件数量)和 reduce task 个数一致。
hive> set hive.enforce.bucketing=true;
创建分桶表
hive> CREATE TABLE bucket(id int, name string, age int)
CLUSTERED BY (age) INTO 4 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
查看表结构(比 desc table;更详细)
hive> desc formatted bucket;
hive> from bucket_test
insert into table bucket
select *;
hive> select * from bucket;
bucket.id bucket.name bucket.age
1 Tom 11
2 Cat 22
3 Dog 33
4 Tony 44
5 Bob 55
6 Hive 66
7 Hadoop 77
8 Java 88
注意:使用 load 加载数据不会出现分桶的效果
[root@node03 ~]# hdfs dfs -cat /user/hive/warehouse/bucket/000000_0
8,Java,88
4,Tony,44
[root@node03 ~]# hdfs dfs -cat /user/hive/warehouse/bucket/000001_0
7,Hadoop,77
3,Dog,33
抽样查询
TABLESAMPLE 语法:TABLESAMPLE(BUCKET x OUT OF y)
x:表示从哪个 bucket 开始抽取数据
y:必须为该表总 bucket 数的倍数或因子
共抽取(bucketNum/y)个桶的数据,抽取第 x,和第(y+(bucketNum/y))个桶中的数据
例如:
TABLESAMPLE(BUCKET 2 OUT OF 16) 桶总数为 32
共抽取 2(32/16)个桶的数据,抽取第 2(x),和第 18(y+32/16)个桶中的数据
TABLESAMPLE(BUCKET 3 OUT OF 256) 桶总数为 32
共抽取 0.125(32/256)个桶的数据,抽取第 3(x)个桶的 1/8 数据
hive> select id, name, age
from bucket
tablesample(bucket 2 out of 4 on age);#取第二个桶
id name age
7 Hadoop 77
3 Dog 33
小结:
分区针对的是数据的存储路径;分桶针对的是数据文件。
分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区,特别是之前所提到过的要确定合适的划分大小这个疑虑。
分桶是将数据集分解成更容易管理的若干部分的另一个技术。
Hive_ 对比分区,分桶相关推荐
- tablesample oracle,Hive DDL 内部表外部表 分区 分桶 行格式 存储文件格式 概述
创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] ...
- HIVE 分区 分桶
在逻辑上分区表与未分区表没有区别,在物理上分区表会将数据按照分区键的列值存储在表目录的子目录中,目录名="分区键=键值".其中需要注意的是分区键的值不一定要基于表的某一列(字段), ...
- Hive 分区表 分桶表
本文目录 1.分区表 Ⅰ.分区表基本操作 1.创建分区表语句 2.分区数据准备 3.装载数据至指定分区 4.数据查询 Ⅰ.全表数据查询 Ⅱ.单个分区数据查询 Ⅲ.多个分区数据查询 5.增加分区 6.删 ...
- Hive分区、分桶操作及其比较(转自:http://blog.csdn.net/epitomizelu/article/details/41911657)
1,Hive分区. 是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表 ...
- pypark hive 开启动态分区_Hive分区与分桶
分区.分桶的作用: 我们知道在传统的DBMs系统中,一般都具有表分区的功能,通过表分区能够在特定的区域检索数据,减少扫描成本,在一定程度上提高了查询效率,当然我们还可以通过进一步在分区上建立索引,进一 ...
- flink的分桶策略BucketAssigner与hive的分区的对应关系
分桶策略在代码withBucketAssigner中设定 Flink写入hive Hive 分桶策略 写入hive中的一个文件夹 保存在文件 分区 指的是如何分配到下游算子中进行计算[2] 保存在 ...
- hive 修改分区备注_Hive分区、分桶操作及其区别
点击上方"风控圈子" 选择"星标"公众号 每天早上8:30,一起实现自我增值 Hive是基于Hadoop的一个数据仓库工具,使用类SQL的查询语句,即HQL对 ...
- 索引、分区和分桶的区别
一.索引 简介 Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapRed ...
- mysql 分桶_使用hive脚本一键动态分区、分区又分桶以及脚本步骤详细详解(亲测成功)...
一.动态分区以及从linux本地文件映射到hive表中. partitioned.sql脚本中的创造数据: mkdir /mytemp cd mytemp vi stu_score.txt 1,zha ...
最新文章
- iOS -- iOS11新特性,如何适配iOS11
- 【Web安全】Weak Session IDs (弱会话IDs)-burp进行Cookie劫持
- 【Google Play】正式版上架流程 ( 创建版本 | 设置国家地区 | 发布正式版 )
- DL之LiRDNNCNN:利用LiR、DNN、CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测
- 学Python可以用来干什么?
- Java 对象的序列化和反序列化
- 前端基础部分错题记录
- RocketMq单机和集群搭建教程
- python实现knn分类_KNN图像分类及Python实现
- 【系列4】使用Dockerfile创建带tomcat的Centos Docker镜像
- 下午,无心编程,读小诗...
- websphere java和进程管理_Websphere 学习(一)
- 网络恶趣实验——二层广播风暴
- 51单片机——串口通信详解(STC89C51为例)
- HBase 事务性 (Transaction)
- SSM综合复习之MyBatis
- 从功能测试进阶自动化测试涨薪7k,终究是逼了自己一把...
- 微软GitHub账户500G源代码被盗取,黑客声称欲免费公布
- matlab画对数坐标图
- 怎么将翼型导入catia_CATIA翼型数据导入与曲面生成CATIA翼型数据导入与曲面生成.doc...