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

PySpark多条件WHERE查询问题:我的查询为何返回0结果?

问题分析与解决方案

你的PySpark查询返回0条结果,核心是逻辑运算符语法错误,可能还存在日期类型不匹配的问题,具体修正如下:

1. 逻辑运算符的错误使用

在PySpark中,&是位运算符,逻辑与需要用and,或者使用&但必须给每个条件单独加括号(因为运算符优先级问题)。你原代码的条件会被错误解析,导致筛选逻辑完全不符合预期。

错误写法:

col('load_date')=='2024-02-08' & (col('acct').isin('C','I'))

(会被解析为:col('load_date') == ('2024-02-08' & col('acct').isin('C','I')),这显然不是你想要的逻辑)

2. 修正后的代码

方案一:使用正确的逻辑与语法(推荐)

from pyspark.sql.functions import col

master_data = spark.read.table('my_table')
# 每个条件单独加括号,用&或者and都可以
master_data_df = master_data.filter(
    (col('load_date') == '2024-02-08') & (col('acct').isin('C', 'I'))
).select('acct', 'id', 'ptc', 'load_date')

print(master_data_df.distinct().count())

方案二:如果load_date是日期类型

如果load_date字段的类型是DateType而非字符串,直接用字符串比较会不匹配,需要将字符串转为日期类型:

from pyspark.sql.functions import col, to_date

master_data = spark.read.table('my_table')
master_data_df = master_data.filter(
    (col('load_date') == to_date('2024-02-08', 'yyyy-MM-dd')) & (col('acct').isin('C', 'I'))
).select('acct', 'id', 'ptc', 'load_date')

print(master_data_df.distinct().count())

方案三:使用SQL表达式风格(更直观,和原SQL一致)

master_data = spark.read.table('my_table')
master_data_df = master_data.filter("load_date = '2024-02-08' AND acct IN ('C', 'I')")\
                           .select('acct', 'id', 'ptc', 'load_date')

print(master_data_df.distinct().count())

额外验证步骤

  • 确认my_table就是SQL中的pvc表,表名没有搞错。
  • 查看表结构,确认load_date的类型:
master_data.printSchema()
  • 先不做过滤,查看表中是否存在符合条件的记录:
master_data.select('acct', 'load_date').distinct().show(20)

内容的提问来源于stack exchange,提问作者Sue shaggy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:43:37