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);
相关推荐
weixin_3077791311 分钟前
Azure云平台数据库迁移方案全解析
服务器·数据仓库·microsoft·azure
半部论语21 分钟前
StarRocks vs Doris:深度剖析与选型分析
数据仓库·big data
难以触及的高度3 小时前
Hive配置JDBC连接
数据仓库·hive·hadoop
派可数据BI可视化4 小时前
什么是 BA ?BA怎么样?BA和BI是什么关系?
大数据·数据仓库·信息可视化·数据分析·商业智能bi
StarRocks_labs8 小时前
vivo 湖仓架构的性能提升之旅
数据仓库·架构·数据分析·云计算·湖仓一体
weixin_307779138 小时前
稳定运行的以Microsoft Azure Cosmos DB数据库为数据源和目标的ETL性能变差时提高性能方法和步骤
数据仓库·microsoft·性能优化·azure·etl
Shyllin9 小时前
Hadoop Mismatched address stored in ZK for NameNode
大数据·hadoop·分布式
梦里1米810 小时前
什么是ETL
数据仓库·etl
杜清卿1 天前
hadoop集群配置-scp拓展使用
大数据·服务器·hadoop