在Spark SQL中如何筛选出Transactions字段最低98%的数据?
解决Spark SQL剔除Transactions字段顶部2%异常值的方案
要筛选出Transactions字段最低98%的数据,Spark SQL可以通过以下两种方案实现,无需依赖TOP函数:
方案1:使用累积分布函数CUME_DIST(精确计算)
CUME_DIST()函数会计算当前行的累积分布比例,即小于等于当前Transactions值的行数占总行数的比例。筛选该比例≤0.98的记录,就能精确保留最低98%的数据。
WITH ranked_data AS ( SELECT Date, ID, Name, Transactions, -- 按Transactions升序计算累积分布 CUME_DIST() OVER (ORDER BY Transactions ASC) AS cumulative_dist FROM transactions_data ) SELECT Date, ID, Name, Transactions FROM ranked_data WHERE cumulative_dist <= 0.98;
方案2:使用近似百分位函数APPROX_PERCENTILE(超大型表首选)
针对超大规模数据集,全量排序的窗口函数性能开销较高。APPROX_PERCENTILE可以快速计算近似的98分位数,再筛选小于等于该分位数的记录,性能更优且误差极小。
-- 先计算Transactions字段的98分位数 WITH percentile_val AS ( SELECT APPROX_PERCENTILE(Transactions, 0.98) AS p98_transactions FROM transactions_data ) SELECT t.Date, t.ID, t.Name, t.Transactions FROM transactions_data t CROSS JOIN percentile_val pv WHERE t.Transactions <= pv.p98_transactions;
方案对比
- 方案1:精确匹配98%的比例,适合数据量中等或对精度要求极高的场景,但全量排序会带来一定性能开销。
- 方案2:通过近似算法实现,性能远优于全量排序,适合TB级以上的超大型表,结果精度足以满足绝大多数业务需求。
内容的提问来源于stack exchange,提问作者confused101
相关产品推荐
相关产品推荐

