《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"为列对象,只会当成普通字符串处理。
解决方法
- 删除错误导入:移除代码中这一行
import org.apache.spark.sql.catalyst.dsl.expressions.{DslExpression, StringToAttributeConversionHelper}
- 在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
相关产品推荐
相关产品推荐

