使用~isin过滤PySpark DataFrame返回空数据框问题求助
PySpark实现NOT IN过滤的问题解决
你的代码存在两处问题,导致返回count为0:
- 语法错误:
filter方法调用缺少闭合括号,正确的cond定义需要补上括号 - 逻辑实现错误:
~df.id.isin(cond.id)中cond.id是Column对象,PySpark的isin方法需要传入具体的值集合(如Python列表),而非Column,这会导致过滤逻辑不符合预期
修正后的解决方案
方案1:收集值列表后使用isin(小数据量适用)
先修正语法错误,再将需要排除的ID收集为本地列表,最后执行过滤:
# 修正语法错误,获取需要排除的ID集合 cond = df.filter(df.id_type.isin([12, 8])).dropDuplicates(['id']) # 收集排除ID到本地列表 exclude_ids = [row.id for row in cond.collect()] # 执行NOT IN过滤并计数 result_count = df.filter(~df.id.isin(exclude_ids)).dropDuplicates(['id']).count() print(result_count) # 预期输出:2
方案2:使用left_anti join(大数据量推荐)
分布式场景下不建议将数据拉到本地,用left_anti join可以高效实现NOT IN逻辑,保留左表中不在右表的记录:
# 修正语法错误,获取需要排除的ID集合 cond = df.filter(df.id_type.isin([12, 8])).dropDuplicates(['id']) # 执行left_anti join,自动过滤掉存在于cond中的ID result_df = df.join(cond, on='id', how='left_anti').dropDuplicates(['id']) result_count = result_df.count() print(result_count) # 预期输出:2
结果说明
根据你的示例DataFrame,符合条件的ID是2和5,所以最终count为2。
内容的提问来源于stack exchange,提问作者Dang
相关产品推荐
相关产品推荐

