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

《Learning Spark》where条件示例使用$"列名"语法报错如何解决?

问题原因

你导入了Spark内部的Catalyst DSL表达式包org.apache.spark.sql.catalyst.dsl.expressions,这个包是Spark SQL内部使用的API,不是面向普通开发者的公开接口。该包下的$"列名"语法会生成Spark内部的Expression类型,它的比较运算符要求两侧都为Expression类型,所以才会报错提示你传入的String类型的"Medical Incident"不符合要求。

另外你没有导入Spark Scala API官方提供的$语法对应的隐式转换,所以IDEA也无法识别$"CallType"为列对象,只会当成普通字符串处理。

解决方法

  1. 删除错误导入:移除代码中这一行
import org.apache.spark.sql.catalyst.dsl.expressions.{DslExpression, StringToAttributeConversionHelper}
  1. 在SparkSession实例创建完成后,添加官方隐式转换导入:
val spark = SparkSession
  .builder
  .appName("DepartmentCalls")
  .getOrCreate()
// 新增这一行,必须放在spark实例创建之后
import spark.implicits._

修改完成后,$"CallType"会被隐式转换为官方公开的org.apache.spark.sql.Column类型,该类型的=!=运算符天然支持和String、Int等基础类型直接比较,编译报错和IDEA识别问题都会消失。

之前你使用col("CallType")能正常运行的原因是col()是org.apache.spark.sql.functions包下的公开方法,返回的就是Column类型,不需要额外的隐式转换支持。

内容的提问来源于stack exchange,提问作者Alexander Lopatin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:36:03