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);
相关推荐
梦想画家19 小时前
从选型到落地:Trino赋能智能制造数据驱动实践
数据仓库·trino·分布式查询·联邦查询
奕成则成21 小时前
Flink全面入门指南:从基础认知到BI数据仓库实践
大数据·数据仓库·flink
鹿衔`2 天前
Hadoop HDFS 核心机制与设计理念浅析文档
大数据·hadoop·hdfs
`林中水滴`2 天前
数仓系列:一文读懂仓湖一体架构
数据仓库
Justice Young2 天前
Sqoop复习笔记
hadoop·笔记·sqoop
大厂技术总监下海2 天前
从Hadoop MapReduce到Apache Spark:一场由“磁盘”到“内存”的速度与范式革命
大数据·hadoop·spark·开源
zgl_200537792 天前
ZGLanguage 解析SQL数据血缘 之 Python提取SQL表级血缘树信息
大数据·数据库·数据仓库·hive·hadoop·python·sql
Justice Young3 天前
Hive第四章:HIVE Operators and Functions
大数据·数据仓库·hive·hadoop
LF3_3 天前
hive,Relative path in absolute URI: ${system:user.name%7D 解决
数据仓库·hive·hadoop
德彪稳坐倒骑驴3 天前
Hive SQL常遗忘的命令
hive·hadoop·sql