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);
相关推荐
Agatha方艺璇1 小时前
Hadoop MapReduce 图文代码讲解
大数据·hadoop·mapreduce
暮 夏2 小时前
在登录页面上添加验证码
数据仓库·hive·hadoop
火龙谷3 小时前
【hadoop】Sqoop数据迁移工具的安装部署
数据库·hadoop·sqoop
悻运5 小时前
配置Hadoop集群环境-使用脚本命令实现集群文件同步
大数据·hadoop·分布式
火龙谷5 小时前
【hadoop】Hbase java api 案例
java·hadoop·hbase
嘟嘟嘟嘟嘟嘟嘟.17 小时前
shell操作文件上传
hadoop
古拉拉明亮之神18 小时前
Spark和Hadoop之间的联系
大数据·hadoop·spark
IT成长日记20 小时前
【Hive入门】Hive增量数据导入:基于Sqoop的关系型数据库同步方案深度解析
数据库·hive·sqoop·关系型数据库同步·增量数据导入
洋芋爱吃芋头21 小时前
hadoop中的序列化和反序列化(2)
大数据·hadoop·分布式
End9281 天前
MapReduce中的分区器
大数据·hadoop