MaxCompute 中 Filter 与 Where 之间的差异

MaxCompute 中 Filter 与 Where 过滤逻辑的差异

在大数据处理和分析中,数据过滤是一个常见且重要的操作。阿里云的MaxCompute作为一款大数据处理平台,提供了丰富的SQL语法来进行数据查询和处理。今天我们来聊一聊在 MaxCompute 中,FILTERWHERE 这两个常用的过滤操作在执行逻辑上的差异。

使用 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查询的执行计划,我们可以清楚地看到 WHEREFILTER 子句在数据处理流程中的不同之处:

WHERE 子句:在数据聚合之前执行,用于过滤原始数据行。它在聚合操作之前就将不符合条件的数据行排除掉。

FILTER 子句:在数据聚合之后执行,用于过滤聚合结果。它在聚合操作之后根据条件对聚合结果进行筛选。

理解这两者的执行顺序和作用,对于编写高效的SQL查询至关重要。在实际应用中,选择合适的过滤方式可以显著提高查询性能和结果的准确性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值