Spark 动态分区剪裁(DPP)

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 效率的提升就会更加显著。那什么是分区剪裁呢?实际上,分区剪裁是谓词下推的一种特例它指的是在分区表中下推谓词,并以文件系统目录

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值