Hive的分区表&分桶表

1.分区表:

        是Hive中的一种表类型,通过将表中的数据划分为多个子集(分区),每个分区对应表中的某个特定的列值,可以提高查询性能和管理数据的效率。分区表的每个分区存储在单独的目录中,分区的定义基于表中的一个或多个列。使用分区表的主要目的是减少查询扫描的数据量,从而提高查询效率。

        分区过细可能导致生成大量的小文件,影响HDFS性能和MapReduce任务的效率。需要定期进行小文件合并操作。

CREATE TABLE customer_data (
  customer_id STRING,
  name STRING,
  age INT,
  email STRING
)
PARTITIONED BY (city STRING)
STORED AS ORC;

select *
from customer_data;

-- 插入 New York 的数据
INSERT INTO TABLE customer_data PARTITION (city='New York')
VALUES
('1', 'John Doe', 30, 'john@example.com'),
('2', 'Jane Smith', 25, 'jane@example.com'),
('3', 'Bob Johnson', 40, 'bob@example.com');

-- 插入 Los Angeles 的数据
INSERT INTO TABLE customer_data PARTITION (city='Los Angeles')
VALUES
('4', 'Alice Brown', 32, 'alice@example.com'),
('5', 'Charlie Davis', 28, 'charlie@example.com');

-- 插入 Chicago 的数据
INSERT INTO TABLE customer_data PARTITION (city='Chicago')
VALUES
('6', 'Eve White', 45, 'eve@example.com'),
('7', 'Frank Black', 37, 'frank@example.com');

可以查看到hdfs上创建了三个目录,对应三个分区,使用带有where条件的select进行查询,会直接从对应的分区目录下查找数据,从而减少查询扫描的数据量,提高性能。

SELECT * FROM customer_data WHERE city='New York';

2.分桶表:

        是Hive中的另一种表类型,通过对表中的数据进行散列分桶(hash bucket),可以进一步提高查询性能,尤其是在进行连接(join)和聚合(aggregation)操作时。分桶表将数据划分为固定数量的桶(bucket),每个桶存储在单独的文件中。
---------------------------------------------------分桶表的特点---------------------------------------------------
数据划分:根据一个或多个列的哈希值,将数据分布到固定数量的桶中。
文件存储:每个桶的数据存储在独立的文件中。
均匀分布:理想情况下,数据在所有桶中均匀分布,从而提高查询性能。

CREATE TABLE customer_data2 (
  customer_id STRING,
  name STRING,
  age INT,
  email STRING
)
CLUSTERED BY (customer_id) INTO 4 BUCKETS
STORED AS ORC;
-- 插入数据到分桶表
--通过这些步骤,我们创建了一个按 customer_id 列进行分桶的 Hive 表 customer_data,并插入了具体的数据。
INSERT INTO TABLE customer_data2 VALUES
('1', 'John Doe', 30, 'john@example.com'),
('2', 'Jane Smith', 25, 'jane@example.com'),
('3', 'Bob Johnson', 40, 'bob@example.com'),
('4', 'Alice Brown', 32, 'alice@example.com'),
('5', 'Charlie Davis', 28, 'charlie@example.com'),
('6', 'Eve White', 45, 'eve@example.com'),
('7', 'Frank Black', 37, 'frank@example.com'),
('8', 'Grace Green', 22, 'grace@example.com');

select *
from customer_data2;

通过查看hdfs上的路径我们可以看到这些数据会按照对应列的hash值分到不同的桶中

### 概念 - **分区表**:Hive区是一种逻辑上的数据划区字段使用的是外字段,并且不保存数据,只是HDFS文件存储目录的一个层级。一个可以指定多个区,插入数据时指定区,相当于新建一个子目录或在原目录添加数据。例如收集大型网站日志数据,可按日期对数据进行区,不同日期的数据存放在不同区 [^2][^3]。 - ****:的字段必须写在结构中,它是将数据按照字段的哈希值散到多个(文件)中 [^4]。 ### 特点 - **分区表**:区目的主要是避免全扫描,从而提升查询和计算效率。按区类型划,可为静态区、动态区和混合区 [^2]。 - ****:支持高效的数据抽样。可以使用 `tablesample` 语法进行抽样,`tablesample(bucket x out of y)` 中,`y` 必须是数的倍数或者因子,Hive 根据 `y` 的大小决定抽样比例 [^5]。 ### 使用场景 - **分区表**:适用于数据量非常大,且可以按照某列或某些列进行自然划的场景。如按日期、地区等对数据进行区,在查询时指定区字段的值,可直接从该区查找,减少全扫描的资源消耗。例如网站日志数据按日期区,销售数据按地区区等 [^3]。 - ****:适用于需要对数据进行高效抽样,或者在进行连接操作时提高性能的场景。例如在进行数据挖掘、机器学习等需要抽样数据进行测试的场景中,可以快速抽取数据 [^5]。 ### 区别 - **建方式**:创建分区表时,区字段不能直接写在结构中,需通过指定区字段和类型的方式成为结构;的字段必须写在结构中,再指定字段。示例如下: ```sql -- 创建分区表 create table stu_par3( id int, name string ) partitioned by (class string) row format delimited fields terminated by '\t'; -- 创建 create table stu_buk( id int, name string ) clustered by (id) into 4 buckets row format delimited fields terminated by '\t'; ``` [^4]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值