Hive的分区分桶和数据抽样

文章目录

我们知道,hive中有分区和分桶的概念,在此篇博客中将对hive的分区表和分桶表的常用操作做一个整理。

分区

概念

分区表的本质就是对应HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive表的一个分区就是一个子目录。把一个大的数据集根据业务需要切分成一个个小的数据集,在查询时通过查询条件选择所需要的指定的分区,这样避免去扫描所有数据文件,大大提升查询的效率。

分区表的操作

创建分区表

sql 复制代码
CREATE TABLE test_partition_table(
    id string,
    name string,
    age int
)
COMMENT '分区测试表'
partitioned by (part_data_id string comment 分区)
STORED AS ORC
;

新建分区

sql 复制代码
ALTER TABLE test_partition_table ADD PARTITION(part_data_id='2025-03-13');

导入数据到指定分区

sh 复制代码
LOAD DATA LOCAL INPATH '/data/test/data.txt' INTO TABLE test_partition_table PARTITION(part_data_id='2025-03-13');

写入数据到指定分区

sql 复制代码
INSERT OVERWRITE TABLE  test_partition_table PARTITION(part_data_id='2025-03-13')
SELECT  
    ID
    ,NAME
    ,AGE
FROM test_table
WHERE
    PART_DATA_ID='2025-03-13'
;

删除分区

sql 复制代码
ALTER TABLE test_partition_table DROP PARTITION(part_data_id='2025-03-13');

删除多个分区

sql 复制代码
ALTER TABLE test_partition_table DROP PARTITION(part_data_id='2025-03-13')
,PARTITION(part_data_id='2025-03-14')
,PARTITION(part_data_id='2025-03-15')
;

查看分区

sql 复制代码
SHOW PARTITIONS test_partition_table;

查看分区表结构

sql 复制代码
DESC FORMATTED test_partition_table;

动态分区

hive支持动态分区,即在数据写入时根据数据的值动态分配写入到相应的分区中。动态分区的功能默认是关闭的,如果需要使用,则需要设置参数开启。

1. 开启动态分区参数设置

sh 复制代码
SET hive.exec.dynamic.partition=true;

2. 设置为非严格模式

动态分区的模式默认是stric严格模式,表示在必须指定至少一个分区为静态分区,nonstric模式表示允许所有的分区字段都可以使用动态分区。

sh 复制代码
SET hive.exec.dynamic.partition.mode=nonstrict;

3. 设置所有节点可创建的最大分区数

在所有执行MR的节点上 ,最大一共可以创建多少个动态分区,默认是1000个。

sh 复制代码
SET hive.exec.max.dynamic.partitions=1000;

4. 设置单个节点可创建的最大分区数

默认为100,该参数需要根据实际的分区字段的值来指定,比如以日期为分区,一年有365天,每天都有数据,如果将这份数据导入到表中就会报错,因为需要的分区数是365,所以需要根据数据的分布调整该参数的大小。

sh 复制代码
SET hive.exec.max.dynamic.partitions.pernode=1000;

5.设置整个MRJob可创建的最大文件数

该参数的默认值为:100000

sh 复制代码
SET hive.exec.max.created.files=100000;

6. 设置当有空分区产生时是否报错,默认值为false

sh 复制代码
SET hive.error.on.empty.partition=false;

分桶

分区表的本质是在HDFS文件系统中创建目录,如果某一天的数据量非常的巨大,还是有可能导致某些查询扫描的数据量过大,所以可以进一步使用分桶的方式来介绍数据的扫描范围。分桶的本质则是将数据文件切分成指定桶数的小文件,类似与关系型数据库中的分区。

创建分桶表

sql 复制代码
CREATE TABLE test_partition_table(
    id string,
    name string,
    age int
)
COMMENT '分区测试表'
partitioned by (part_data_id string comment 分区)
clustered by(name) into 7 buckets
STORED AS ORC
;

抽样

我们在使用数据时,有时候并不想查询所有的数据,只需要其中的一部分,这时候就可以使用抽样函数来实现。

抽样

tablesample(BUCKET X OUT OF Y ON {bucket_col})

按照指定的分桶列,分成Y个桶,并从第X个桶开始中抽取数据。

sql 复制代码
SELECT * FROM test_partition_table tablesample(bucket 5 out of 10 on name);
相关推荐
RestCloud11 小时前
如何用ETL做实时风控?从交易日志到告警系统的实现
数据库·数据仓库·kafka·数据安全·etl·数据处理·数据集成
咨询QQ:48773927815 小时前
探索Qt下的UI皮肤生成器:多风格与编译那些事儿
hive
阿杰同学15 小时前
Hadoop 面试题及答案整理,最新面试题
大数据·hadoop·分布式
皓空揽月17 小时前
Ubuntu 单机安装 Hadoop 3.2.4教程
linux·hadoop·ubuntu
QQ129584550419 小时前
SSAS-检查字段里的不可见字符
数据库·数据仓库·数据分析
YiRan_Zhao20 小时前
spark读取odps(maxcompute)数据配置idea
大数据·数据仓库·odps
lalala_lulu21 小时前
Jsp的四种作用域(超详细)
java·开发语言·hive
写代码的【黑咖啡】2 天前
HDFS简介及其存储机制详解
大数据·hadoop·hdfs
俊哥大数据2 天前
【项目实战1】大数据项目开发案例---新闻资讯离线分析|实时分析|大数据仓库|推荐系统|数据可视化项目
数据仓库·hadoop·flink·spark·推荐系统·实时分析·离线分析
忘记9262 天前
Servlet 生命周期
数据仓库·hive·hadoop