hive分区表 静态分区和动态分区

一、静态分区

现有数据文件 data_file 如下:

2023-08-01,Product A,100.0
2023-08-05,Product B,150.0
2023-08-10,Product A,200.0


1、创建分区表

CREATE TABLE sales (
    sale_date STRING,
    product STRING,
    amount DOUBLE
)
PARTITIONED BY (sale_year INT, sale_month INT);

2、加载数据文件到分区表中

LOAD DATA INPATH '/path/to/data_file'
INTO TABLE sales
PARTITION (sale_year=2023, sale_month=8);

二、动态分区

现有源数据表如下:
CREATE TABLE sales_source (
    sale_date STRING,
    product STRING,
    amount DOUBLE
);

INSERT INTO sales_source VALUES
    ('2023-08-01', 'Product A', 100.0),
    ('2023-08-05', 'Product B', 150.0),
    ('2023-08-10', 'Product A', 200.0),
    ('2023-08-12', 'Product C', 120.0),
    ('2023-08-15', 'Product B', 180.0);
 

 1、创建分区表

CREATE TABLE sales (
    sale_date STRING,
    product STRING,
    amount DOUBLE
)
PARTITIONED BY (sale_year INT, sale_month INT);

2、实现动态插入

INSERT INTO sales PARTITION (sale_year, sale_month)
SELECT sale_date, product, amount, YEAR(sale_date), MONTH(sale_date)
FROM sales_source
WHERE sale_date BETWEEN '2023-08-01' AND '2023-08-15';

三、总结
 

动态分区:

在动态分区中,分区值是根据插入的数据动态计算得出的,无需事先创建分区目录。这样的分区方式更加灵活,适用于数据分布不确定或分区值频繁变化的情况。动态分区操作通常会涉及到 MapReduce 任务。

静态分区:

在静态分区中,你在创建表时预先定义了分区值,并手动创建了相应的分区目录。这意味着你需要为每个可能的分区值手动创建一个目录,然后将数据加载到这些目录中。静态分区需要事先知道数据应该放置在哪些分区中,适用于在创建表时已经确定分区结构的情况。

二者的使用场景:
 

静态分区的使用场景:

  1. 已知分区值: 当数据的分区值在创建表时已经确定,并且不太可能频繁变化时,静态分区是一个较好的选择。

  2. 精确控制和性能 静态分区允许你精确地控制数据的存储位置,以及在查询时可能提供更好的性能,尤其在大量数据的情况下。

  3. 预先加载: 如果你有大量数据需要加载,并且已经知道数据应该放置在哪些分区中,可以提前创建分区目录,然后一次性加载数据。

动态分区的使用场景:

  1. 未知分区值: 当分区值在插入数据时才能确定,或者可能频繁变化时,动态分区提供了更大的灵活性。

  2. 自动计算分区值: 动态分区可以自动计算分区列的值,避免了手动计算和指定的麻烦。

  3. 灵活性: 如果需要从另一个表或外部数据源选择数据并插入到分区表中,动态分区可以更方便地进行批量操作。

  4. 减少手动操作: 动态分区减少了手动创建分区目录的需求,使数据加载过程更自动化。

总的来说,静态分区性能更好,动态分区更加方便 更加灵活
综合考虑,你可以根据数据的特点、分区值的变化频率、数据加载需求和查询性能等因素来选择适合你的分区方式。在一些情况下,也可以结合使用两种分区方式,以满足不同的数据管理和查询需求。

你可能感兴趣的:(hive,数据仓库)