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

使用~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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:57:22