PySpark SQL转换问题:含LEFT与IN的SQL语句无法正常运行
解决PySpark转换SQL查询的问题
你要转换的SQL查询是要筛选出PAT字段前3位为123或203的去重记录,咱们先看看你现有代码里的几个问题:
- 列比较用了赋值符号
=,PySpark里列之间的比较需要用==; - 只处理了
123这一个前缀,没覆盖203的情况; - 代码里的
show OR是语法错误,逻辑判断要用到正确的运算符,而且show()是需要调用的方法; - 原SQL里的
Distinct在PySpark里需要用dropDuplicates()来实现。
下面给你几种可行的写法:
方法1:用substr + isin(最贴近原SQL逻辑)
from pyspark.sql.functions import col # 假设PAT_Data是你的源DataFrame df_data = PAT_Data # 先过滤符合条件的记录,再去重,最后展示结果 df_data.filter(col("PAT").substr(1, 3).isin("123", "203")).dropDuplicates().show()
方法2:用like + 逻辑或(适合前缀匹配场景)
如果是前缀匹配,用like也很直观,通过|来表示“或”的逻辑:
from pyspark.sql.functions import col df_data = PAT_Data df_data.filter((col("PAT").like("123%")) | (col("PAT").like("203%"))).dropDuplicates().show()
方法3:直接在PySpark中运行SQL表达式
如果你更习惯写SQL,可以把DataFrame注册成临时视图,直接执行原SQL查询:
# 注册临时视图 PAT_Data.createOrReplaceTempView("Dataset") # 执行原SQL并展示结果 spark.sql("SELECT DISTINCT * FROM Dataset WHERE left(PAT,3) IN ('123','203')").show()
这几种方法都能实现你原SQL的功能,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者techgiant
相关产品推荐
相关产品推荐

