一、静态分区
现有数据文件 data_file 如下:
2023-08-01,Product A,100.0
2023-08-05,Product B,150.0
2023-08-10,Product A,200.0
1、创建分区表
sql
CREATE TABLE sales (
sale_date STRING,
product STRING,
amount DOUBLE
)
PARTITIONED BY (sale_year INT, sale_month INT);
2、加载数据文件到分区表中
sql
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、创建分区表
sql
CREATE TABLE sales (
sale_date STRING,
product STRING,
amount DOUBLE
)
PARTITIONED BY (sale_year INT, sale_month INT);
2、实现动态插入
sql
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 任务。
静态分区:
在静态分区中,你在创建表时预先定义了分区值,并手动创建了相应的分区目录。这意味着你需要为每个可能的分区值手动创建一个目录,然后将数据加载到这些目录中。静态分区需要事先知道数据应该放置在哪些分区中,适用于在创建表时已经确定分区结构的情况。
二者的使用场景:
静态分区的使用场景:
已知分区值: 当数据的分区值在创建表时已经确定,并且不太可能频繁变化时,静态分区是一个较好的选择。
精确控制和性能: 静态分区允许你精确地控制数据的存储位置,以及在查询时可能提供更好的性能,尤其在大量数据的情况下。
预先加载: 如果你有大量数据需要加载,并且已经知道数据应该放置在哪些分区中,可以提前创建分区目录,然后一次性加载数据。
动态分区的使用场景:
未知分区值: 当分区值在插入数据时才能确定,或者可能频繁变化时,动态分区提供了更大的灵活性。
自动计算分区值: 动态分区可以自动计算分区列的值,避免了手动计算和指定的麻烦。
灵活性: 如果需要从另一个表或外部数据源选择数据并插入到分区表中,动态分区可以更方便地进行批量操作。
减少手动操作: 动态分区减少了手动创建分区目录的需求,使数据加载过程更自动化。
总的来说,静态分区性能更好,动态分区更加方便 更加灵活
综合考虑,你可以根据数据的特点、分区值的变化频率、数据加载需求和查询性能等因素来选择适合你的分区方式。在一些情况下,也可以结合使用两种分区方式,以满足不同的数据管理和查询需求。