首页 > 解决方案 > 多级分区表的 Spark (EMR) 分区修剪行为

问题描述

如果我有一个使用多级分区创建的表,即由两列(州、市)组成,如下所示:

    state=CA,city=Anaheim
    state=Texas,city=Houston
    state=Texas,city=Dallas
    state=Texas,city=Austin
    state=CA,city=SanDiego

如果我运行这样的选择查询:

select * from table_name where city=Houston

即在哪里使用了第二个分区列,它会扫描city=Houston分区state=Texas吗?我很确定这就是 Hive 的运作方式,但我很想确认 Spark 中的行为。此外,如果它在 EMR 的 Spark 中执行,行为会有什么不同吗?

标签: apache-sparkhiveapache-spark-sqlamazon-emrhive-partitions

解决方案


如果您使用 hive 存储表,那么它肯定能够对外部和内部分区进行分区修剪。Hive 单独保存有关表的分区信息的元数据。因此,当查询针对特定分区时,它能够进行优化。

您实际上可以使用以下方法测试此行为explain select * from table_name where city ='Houston';

但是,如果您使用 spark 以嵌套结构编写分区,那么我不太确定。如果查询需要遍历整个目录结构,当目录数量巨大时,这将是昂贵的。


推荐阅读