Scala中DataFrame多条件过滤(IN/NOT IN子句)问题求助
Scala Spark 实现SQL过滤逻辑的正确写法
你的两种写法都存在语法错误,具体问题和修正方案如下:
错误分析
- 写法一:Scala中判断列值相等必须用
===(Spark Column的相等运算符),而你用了赋值运算符=,导致语法错误;另外<>可以用,但更推荐Spark标准的=!=运算符。 - 写法二:结构错误,
initDf.filter(...)返回的是DataFrame对象,不能直接与&&后的Column对象做逻辑运算;同样存在=误用为赋值的问题,且括号不匹配。
正确写法
修正后的链式Filter写法
保留你链式调用的风格,替换错误的运算符即可:
val finalDf: DataFrame = initDf.filter(col("col1") === "abc") .filter(col("col2") =!= 0) .filter(col("col2") =!= 4) .filter(col("col3") === 1 || col("col3") === 2 || col("col3") === 3 || col("col3") === 4)
更简洁的单Filter组合写法
利用Spark的isin方法简化IN/NOT IN逻辑,将所有条件合并到一个filter中:
import org.apache.spark.sql.functions.col val finalDf: DataFrame = initDf.filter( col("col1") === "abc" && !col("col2").isin(0, 4) // NOT IN 通过!取反实现 && col("col3").isin(1, 2, 3, 4) )
直接使用SQL表达式写法
如果更习惯原生SQL语法,可以直接传入SQL字符串到filter:
val finalDf: DataFrame = initDf.filter( """col1 = 'abc' AND col2 NOT IN (0,4) AND col3 IN (1,2,3,4)""" )
内容的提问来源于stack exchange,提问作者Mani
相关产品推荐
相关产品推荐

