Spark 动态分区剪裁(DPP)
DPP(Dynamic Partition Pruning,动态分区剪裁)是 Spark 3.0 版本中第二个引人注目的特性,它指的是在星型数仓的数据关联场景中,可以充分利用过滤之后的维度表,大幅削减事实表的数据扫描量,从整体上提升关联计算的执行性能。
我们就通过一个电商场景下的例子,来说说什么是分区剪裁,什么是动态分区剪裁,它的作用、用法和注意事项,让你一次就学会怎么用好 DPP。
分区剪裁
我们先来看这个例子。在星型(Start Schema)数仓中,我们有两张表,一张是订单表 orders,另一张是用户表 users。显然,订单表是事实表(Fact),而用户表是维度表(Dimension)。业务需求是统计所有头部用户贡献的营业额,并按照营业额倒序排序。那这个需求该怎么实现呢?
// 订单表orders关键字段
userId, Int
itemId, Int
price, Float
quantity, Int
// 用户表users关键字段
id, Int
name, String
type, String //枚举值,分为头部用户和长尾用户
给定上述数据表,我们只需把两张表做内关联,然后分组、聚合、排序,就可以实现业务逻辑,具体的查询语句如下。
select
(orders.price * order.quantity) as income, users.name
from
orders
inner join
users
on
orders.userId = users.id
where
users.type = ‘Head User’
group by
users.name
order by
income desc
看到这样的查询语句,再结合 Spark SQL 那几讲学到的知识,我们很快就能画出它的逻辑执行计划。
由于查询语句中事实表上没有过滤条件,因此,在执行计划的左侧,Spark SQL 选择全表扫描的方式来投影出 userId、price 和 quantity 这些字段。相反,维度表上有过滤条件 users.type = ‘Head User’,因此,Spark SQL 可以应用谓词下推规则,把过滤操作下推到数据源之上,来减少必需的磁盘 I/O 开销。
虽然谓词下推已经很给力了,但如果用户表支持分区剪裁(Partition Pruning),I/O 效率的提升就会更加显著。那什么是分区剪裁呢?实际上,分区剪裁是谓词下推的一种特例,它指的是在分区表中下推谓词,并以文件系统目录