Table Partition

使用分区表可以显著提高查询性能,特别是对于大规模数据集的查询。

通过将数据分散存储在不同的分区中,可以实现数据的局部性,减少数据的读取和传输量。而在查询时,只需要读取与查询条件相关的分区,避免了扫描整个表的数据。

此外,分区表还可以与其他性能优化技术结合使用,如索引和分桶。通过在分区列上创建索引,可以进一步加速查询,而使用分桶可以将数据划分为更小的块,提高查询的并行度。

建立Partition

本节我们继续基于之前的retailcust表,对它作partition

对Country字段建立分区表后,spark会根据Country分成不同的文件,这样查询某个Country时,只会扫描该country对应的文件

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

# 根据country做动态分区
create external table retailcust_partitioned (age INT, salary FLOAT,gender String, purchased String) partitioned by (country String) location  '/user/kongpingfan/data/';

打开另一个shell,执行以下命令查看目录下文件。由于还没有往分区里写数据,所以目录暂时为空:

hadoop fs -ls /user/kongpingfan/data/

往分区表里插入数据:

insert into table retailcust_partitioned partition(country) select * from retail_parquet;

插入完成后,重新查看HDFS目录中的数据,此时按国家名称分成了三个文件:

kongpingfan@cluster-7d0c-m:~$ hadoop fs -ls /user/kongpingfan/retailcust-partitioned/
Found 3 items
drwxr-xr-x   - kongpingfan hadoop          0 2022-06-05 15:37 /user/kongpingfan/retailcust-partitioned/country=England
drwxr-xr-x   - kongpingfan hadoop          0 2022-06-05 15:37 /user/kongpingfan/retailcust-partitioned/country=France
drwxr-xr-x   - kongpingfan hadoop          0 2022-06-05 15:37 /user/kongpingfan/retailcust-partitioned/country=Germany