MaxCompute 中 Filter 与 Where 过滤逻辑的差异
在大数据处理和分析中,数据过滤是一个常见且重要的操作。阿里云的MaxCompute作为一款大数据处理平台,提供了丰富的SQL语法来进行数据查询和处理。今天我们来聊一聊在 MaxCompute 中,FILTER 和 WHERE 这两个常用的过滤操作在执行逻辑上的差异。
使用 WHERE 子句进行过滤
首先,我们来看一个使用 WHERE 子句进行过滤的SQL查询:
SELECT COUNT(uid)
FROM dws_daily_visitor_uid
WHERE pt = '20240818'
AND browser_pc_visit = 1
;
执行计划分析
执行计划如下:
job0 is root job
In Job job0:
root Tasks: M1
In Task M1:
Data source: columbus.dws_daily_visitor_uid/pt=20240818
TS: columbus.dws_daily_visitor_uid/pt=20240818
Statistics: Num rows: 79520.0, Data size: 8588160.0
SEL: IF(EQ(browser_pc_visit,1L),uid,null) __agg_0_p0
Statistics: Num rows: 79520.0, Data size: 7952000.0
AGGREGATE:
UDAF: COUNT(__agg_0_p0) (__agg_0_count)[Complete]
Statistics: Num rows: 1.0, Data size: 8.0
FS: output: Screen
schema:
__agg_0 (bigint) AS _c0
Statistics: Num rows: 1.0, Data size: 8.0
OK
从执行计划中可以看出,WHERE 子句在数据聚合之前执行。具体步骤如下:
1、数据筛选:首先从数据源中筛选出 pt = ‘20240818’ 的数据行。
2、聚合操作:然后对筛选后的数据进行聚合操作,计算 uid 的个数。
使用 FILTER 子句进行过滤
接下来,我们来看一个使用 FILTER 子句进行过滤的SQL查询:
EXPLAIN SELECT COUNT(uid) FILTER (WHERE browser_pc_visit = 1)
FROM dws_daily_visitor_uid
WHERE pt = '20240818';
执行计划分析
执行计划如下:
job0 is root job
In Job job0:
root Tasks: M1
In Task M1:
Data source: columbus.dws_daily_visitor_uid/pt=20240818
TS: columbus.dws_daily_visitor_uid/pt=20240818
Statistics: Num rows: 79520.0, Data size: 8588160.0
SEL: uid CONDITION: EQ(browser_pc_visit,1L)
Statistics: Num rows: 39760.0, Data size: 3976000.0
AGGREGATE:
UDAF: COUNT(uid) (__agg_0_count)[Complete]
Statistics: Num rows: 1.0, Data size: 8.0
FS: output: Screen
schema:
__agg_0 (bigint) AS _c0
Statistics: Num rows: 1.0, Data size: 8.0
OK
从执行计划中可以看出,FILTER 子句在数据聚合之后执行。具体步骤如下:
1、数据筛选:首先从数据源中筛选出 pt = ‘20240818’ 的数据行。
2、聚合操作:然后对筛选后的数据进行聚合操作,计算满足 browser_pc_visit = 1 条件的 uid 数量。
总结
通过对比这两个SQL查询的执行计划,我们可以清楚地看到 WHERE 和 FILTER 子句在数据处理流程中的不同之处:
WHERE 子句:在数据聚合之前执行,用于过滤原始数据行。它在聚合操作之前就将不符合条件的数据行排除掉。
FILTER 子句:在数据聚合之后执行,用于过滤聚合结果。它在聚合操作之后根据条件对聚合结果进行筛选。
理解这两者的执行顺序和作用,对于编写高效的SQL查询至关重要。在实际应用中,选择合适的过滤方式可以显著提高查询性能和结果的准确性。