hive表分区

本文介绍如何在Hive中创建单分区和双分区表,并提供了添加、删除分区及加载数据的具体语法示例。

必须在表定义时创建partition

 

a、单分区建表语句:create table day_table (id int, content string) partitioned by (dt string);单分区表,按天分区,在表结构中存在id,content,dt三列。

以dt为文件夹区分

b、双分区建表语句:create table day_hour_table (id int, content string)partitioned by (dt string, hour string);双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。

先以dt为文件夹,再以hour子文件夹区分

 

添加分区表语法(表已创建,在此基础上添加分区):ALTER TABLE table_name ADD
partition_spec [ LOCATION 'location1' ]
partition_spec [ LOCATION 'location2' ] ...

ALTER TABLE day_table ADD
PARTITION (dt='2008-08-08', hour='08')
location '/path/pv1.txt'

 

删除分区语法:ALTER TABLE table_name DROP
partition_spec, partition_spec,...

用户可以用 ALTER TABLE DROP PARTITION 来删除分区。分区的元数据和数据将被一并删除。例:ALTER TABLE day_hour_table DROP PARTITION (dt='2008-08-08', hour='09');

数据加载进分区表中语法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

例:

LOAD DATA INPATH '/user/pv.txt' INTO TABLE day_hour_table PARTITION(dt='2008-08- 08', hour='08');LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hour partition(dt='2010-07- 07');当数据被加载至表中时,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时在表下自动创建一个目录
基于分区的查询的语句:SELECT day_table.* FROM day_table WHERE day_table.dt>= '2008-08-08';

查看分区语句

hive> show partitions day_hour_table;OKdt=2008-08-08/hour=08dt=2008-08-08/hour=09dt=2008-08-09/hour=09
Hive 表分区和 Oracle 表分区存在多方面的区别: ### 数据存储 - **Hive**:Hive 是基于 Hadoop 的数据仓库工具,其表数据通常存储在 Hadoop 分布式文件系统(HDFS)中。分区以目录的形式存在,每个分区对应一个目录,分区键的值作为目录名,数据文件存放在这些目录下。例如,一个按日期分区Hive 表,不同日期的数据会存放在以日期命名的不同目录中。 - **Oracle**:Oracle 是传统的关系型数据库,表数据存储在数据库的表空间中。分区是表的逻辑划分,数据物理上仍然存储在表空间的段(segment)中,通过数据字典来管理分区信息。 ### 分区类型 - **Hive**:支持范围分区、列表分区、哈希分区和复合分区。范围分区根据列值的范围划分,如按日期范围;列表分区按列值的列表划分,如按地区列表;哈希分区将数据均匀分布到指定数量的分区;复合分区是多种分区方式的组合。 ```sql -- Hive 范围分区示例 CREATE TABLE sales ( id INT, sale_date DATE, amount DECIMAL(10, 2) ) PARTITIONED BY (sale_year INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; ``` - **Oracle**:除了范围分区、列表分区、哈希分区外,还支持键分区、间隔分区、系统分区等。键分区类似于哈希分区,但使用用户定义的键;间隔分区在范围分区基础上,当插入新数据超出已有分区范围时,自动创建新的分区;系统分区由数据库管理员指定数据存储的分区。 ```sql -- Oracle 范围分区示例 CREATE TABLE sales ( id NUMBER, sale_date DATE, amount NUMBER(10, 2) ) PARTITION BY RANGE (sale_date) ( PARTITION p_2023 VALUES LESS THAN (TO_DATE('01 - 01 - 2024', 'DD - MM - YYYY')), PARTITION p_2024 VALUES LESS THAN (TO_DATE('01 - 01 - 2025', 'DD - MM - YYYY')) ); ``` ### 性能优化侧重点 - **Hive**:主要用于处理大规模数据的批处理任务,分区主要是为了减少数据扫描量,提高查询性能。在执行查询时,Hive 可以根据分区键过滤数据,只扫描相关分区的数据,避免全量数据扫描。但 Hive 的查询性能受 Hadoop 集群性能影响较大。 - **Oracle**:更注重事务处理和实时查询性能。分区可以提高数据的并发访问能力,减少锁的竞争,同时通过索引和分区的结合,进一步优化查询性能。Oracle 的分区管理功能可以更好地支持在线数据维护操作,如分区的拆分、合并等,而不影响数据的可用性。 ### 分区管理 - **Hive**:分区管理通常需要手动操作,如添加分区、删除分区等。添加分区需要使用 `ALTER TABLE ADD PARTITION` 语句,删除分区使用 `ALTER TABLE DROP PARTITION` 语句。而且 Hive 不支持分区的动态扩展,需要预先规划好分区。 ```sql -- Hive 添加分区 ALTER TABLE sales ADD PARTITION (sale_year = 2024); ``` - **Oracle**:提供了更丰富的分区管理功能,支持在线分区操作,如分区的拆分、合并、交换等,并且可以通过自动分区(如间隔分区)来处理新数据的插入,无需手动干预。 ```sql -- Oracle 拆分分区 ALTER TABLE sales SPLIT PARTITION p_2024 AT (TO_DATE('01 - 07 - 2024', 'DD - MM - YYYY')) INTO (PARTITION p_2024_h1, PARTITION p_2024_h2); ``` ### 数据插入 - **Hive**:数据插入通常是批量加载的方式,如从文件系统加载数据到 Hive 表中。插入数据时需要指定分区信息,如果分区不存在,需要先创建分区。 ```sql -- Hive 批量加载数据到分区表 LOAD DATA INPATH '/user/data/sales_2024.csv' INTO TABLE sales PARTITION (sale_year = 2024); ``` - **Oracle**:支持单条插入和批量插入,插入数据时会自动根据分区键将数据分配到相应的分区中,无需额外指定分区信息。 ```sql -- Oracle 单条插入数据 INSERT INTO sales (id, sale_date, amount) VALUES (1, TO_DATE('01 - 01 - 2024', 'DD - MM - YYYY'), 1000); ``` ### 索引使用 - **Hive**:从 0.7.0 版本开始加入了索引,目的是提高 Hive 表指定列的查询速度。没有索引的时候,Hive 在执行查询时需要加载整个表或者整个分区,然后处理所有的数据,但当在指定列上存在索引,再通过指定列查询时,那么只会加载和处理部分文件[^1]。不过 Hive 的索引使用相对复杂,且索引的维护成本较高。 - **Oracle**:提供了丰富的索引类型,如 B - 树索引、位图索引、函数索引等,并且可以在分区表上创建局部索引和全局索引,索引的管理和使用更加灵活高效。 ### 适用场景 - **Hive**:适用于大规模数据的离线分析和处理,如日志分析、数据仓库等场景,对数据处理的吞吐量要求较高。 - **Oracle**:适用于企业级的事务处理系统、联机分析处理(OLAP)等场景,对数据的实时性、一致性和并发处理能力要求较高。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值