如何基于条件移除PySpark DataFrame中的特定Null值?
移除重复ID+订阅计划对应的Null付费频率记录
原始表 user_info
user_info +------+------------------+---------------------+ | id | subscription_plan| payment_frequency | +------+------------------+---------------------+ | 3004 | Netflix | Monthly | | 3004 | Disney + | Monthly | | 3004 | Netflix | Null | | 3006 | Star + | Yearly | | 3006 | Apple TV | Yearly | | 3006 | Netflix | Monthly | | 3006 | Star + | Null | | 3009 | Apple TV | Null | | 3009 | Star + | Monthly | +------+------------------+---------------------+
需求说明
需要精准删除特定Null记录:
- 当同一个
id和subscription_plan存在多条记录时,删除其中payment_frequency为Null的那条 - 如果某个
id+subscription_plan组合只有一条记录,哪怕payment_frequency是Null也要保留(比如ID 3009的Apple TV记录)
不能直接删除所有payment_frequency为Null的记录,否则会误删需要保留的唯一Null记录。
解决方案
方法1:使用窗口函数(适用于MySQL 8+、PostgreSQL、SQL Server等支持窗口函数的数据库)
DELETE FROM user_info WHERE (id, subscription_plan, payment_frequency) IN ( SELECT id, subscription_plan, payment_frequency FROM ( SELECT id, subscription_plan, payment_frequency, -- 统计每个id+订阅计划组合的记录数 COUNT(*) OVER (PARTITION BY id, subscription_plan) AS record_count FROM user_info ) temp -- 只删除重复组合里的Null记录 WHERE record_count > 1 AND payment_frequency IS NULL );
方法2:使用EXISTS子查询(兼容性更强,适用于多数数据库)
DELETE FROM user_info u1 -- 目标是Null记录 WHERE u1.payment_frequency IS NULL -- 同时存在同id+订阅计划的非Null记录 AND EXISTS ( SELECT 1 FROM user_info u2 WHERE u2.id = u1.id AND u2.subscription_plan = u1.subscription_plan AND u2.payment_frequency IS NOT NULL );
两种方法逻辑一致:只清除那些有“替代项”的Null记录,保留没有重复的唯一Null记录。
执行后期望结果
user_info +------+------------------+---------------------+ | id | subscription_plan| payment_frequency | +------+------------------+---------------------+ | 3004 | Netflix | Monthly | | 3004 | Disney + | Monthly | | 3006 | Star + | Yearly | | 3006 | Apple TV | Yearly | | 3006 | Netflix | Monthly | | 3009 | Apple TV | Null | | 3009 | Star + | Monthly | +------+------------------+---------------------+
内容的提问来源于stack exchange,提问作者Marcos Dias
相关产品推荐
相关产品推荐

