Hive 分区与分桶
一、Hive创建分区表语句
CREATETABLE employee_partitioned(
name string,
work_place ARRAY<string>,
sex_age STRUCT<sex:string,age:int>,
skills_score MAP<string,int>,
depart_title MAP<STRING,ARRAY<STRING>>)
指定分区“year”
PARTITIONE BY(year INT,month INT)
CLUSTERED BY(employee_id) INTO 2 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
COLLECTION ITEMS TERMINATED BY','
MAP KEYS TERMINATED BY':';
stroed as textfile
强制分桶
set hive.enforce.bucketing=true;
使用emp表中的数据进行插入
Insert into table emp_name_buckets select * from emp;
二、Hive分区表/分桶表描述
(一)、Hive分区表描述回顾
1、分区列的值将表划分为文件夹
2、查询时使用“分区”列和常规列类似
3、查询时Hive自动过滤掉不用于提高性能的分区
(二)Hive分桶表描述回顾
1、分桶是相对分区进行更细粒度的划分
2、根据“桶列”的哈希函数将数据进行分桶
3、更高的查询处理效率
三、Hive分区、分桶(静态与动态)
(一)、动态分区:使用动态分区需设置
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
(二)Hive分桶:动态分桶(使用动态分桶需设置)
set hive.enforce.bucketing =true;
- 分桶相关操作
(一)随机抽样基于整行数据
SELECT*FROM table_name TABLESAMPLE(BUCKET 30UT OF 32 ON rand()s;
(二)随机抽样基于指定列(使用分桶列更高效)
SELECT*FROM table_name TABLESAMPLE(BUCKET 30UT OF 32 ON id)s;
(三)随机抽样基于block size
SELECT*FROM table_name TABLESAMPLE(10 PERCENT)s;
SELECT*FROM table_name TABLESAMPLE(1M)s;
SELECT*FROM table_name TABLESAMPLE(10 rows)s;
五、概念
(一)什么是分区
在Hive中,分区是将表的数据按照某个列的值进行划分和存储的一种方式。通过分区,可以将数据按照特定的维度进行组织,提高查询效率和数据管理的灵活性。
(二) 分区的优势
1、提高查询性能:通过分区,可以将数据按照特定的列值进行划分,使得查询只需要扫描特定分区的数据,减少了全表扫描的开销。
2、管理数据更加灵活:可以根据业务需求对数据进行分区,方便数据的管理和维护。
3、支持数据生命周期管理:可以根据数据的时间或其他维度进行分区,方便数据的归档和清理。
(三) 什么是分桶
分桶是将表的数据按照哈希函数的结果进行划分和存储的一种方式。通过分桶,可以将数据均匀地分布到不同的桶中,提高查询的并行度和性能。
(四)分桶的优势
1、提高查询性能:通过分桶,可以将数据均匀地分布到不同的桶中,使得查询可以并行地处理不同的桶,提高查询性能。
2、支持随机抽样:分桶可以方便地进行随机抽样操作,从而进行数据分析和调试。