Spark基于DataFrame过滤数据时遇不支持特性错误求助
问题解决:Spark DataFrame过滤时isin方法报错
错误原因
isin方法需要接收可变参数(多个独立的字面量值),而你直接传入了一个List对象,Spark无法将整个List解析为合法的过滤条件,因此抛出不支持该类型字面量的异常。
解决方案
方案1:将List转为可变参数传入
修改filter语句,用: _*将List拆分为可变参数,适配isin的参数要求:
import org.apache.spark.sql.functions._ import spark.implicits._ val allData = Seq( ("id1", "X"), ("id2", "X"), ("id3", "Y"), ("id4", "A") ).toDF("id", "type") val wrongTypes = Seq( ("X"), ("Y"), ("Z") ).toDF("type").select("type").map(r => r.getString(0)).collect.toList // 关键修改:用: _*将List转为可变参数 allData.filter(col("type").isin(wrongTypes: _*)).show()
方案2:使用left_anti join(更推荐)
如果wrongTypes数据量较大(比如你提到的2000条),不建议将数据collect到Driver端,而是直接用Spark的分布式join操作实现过滤,性能更优:
import org.apache.spark.sql.functions._ import spark.implicits._ val allData = Seq( ("id1", "X"), ("id2", "X"), ("id3", "Y"), ("id4", "A") ).toDF("id", "type") val wrongTypes = Seq( ("X"), ("Y"), ("Z") ).toDF("type") // left_anti join会保留allData中不在wrongTypes里的记录 allData.join(wrongTypes, Seq("type"), "left_anti").show()
两种方案都能得到正确结果:
+---+----+ | id|type| +---+----+ |id4| A| +---+----+
内容的提问来源于stack exchange,提问作者user2695543
相关产品推荐
相关产品推荐

