You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:40:13