使用分区表可以显著提高查询性能,特别是对于大规模数据集的查询。
通过将数据分散存储在不同的分区中,可以实现数据的局部性,减少数据的读取和传输量。而在查询时,只需要读取与查询条件相关的分区,避免了扫描整个表的数据。
此外,分区表还可以与其他性能优化技术结合使用,如索引和分桶。通过在分区列上创建索引,可以进一步加速查询,而使用分桶可以将数据划分为更小的块,提高查询的并行度。
本节我们继续基于之前的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