Databricks Scala代码报错:未找到when值,请求协助排查
解决Spark Scala中
not found: value when的问题 嗨,作为Databricks新手遇到这个问题很正常!你碰到的not found: value when错误,核心原因是没有导入Spark SQL提供的when内置函数——这个函数不是Scala原生的,属于Spark的函数库,必须显式导入才能使用。
修复步骤:
导入必要的Spark SQL函数
在你的代码开头添加这行导入语句,它会导入所有Spark SQL内置函数(包括when):import org.apache.spark.sql.functions._如果你只想单独导入
when,也可以写:import org.apache.spark.sql.functions.when修正
withColumn的使用(注意DataFrame的不可变性)
Spark的DataFrame是不可变数据结构,withColumn这类转换操作会返回一个新的DataFrame,而不是修改原有的。所以你需要把新增列后的结果赋值给一个新变量,否则无法使用新增的列。
完整修正后的代码
// 导入Spark SQL内置函数 import org.apache.spark.sql.functions._ val sv_string = "select * from temp_tbl_ASBReports r left join temp_tbl_ASBInvestigations i on r.nh_parentasbcase = i.nh_asbcaseid" val df_asbreportssv = spark.sql(sv_string) // 新增InInvestigation列,赋值给新变量 val df_with_investigation = df_asbreportssv.withColumn( "InInvestigation", when(col("nh_parentasbcase").isNull, 0).otherwise(1) ) // 如果你需要字符串类型的0/1,就用引号包裹值: // val df_with_investigation = df_asbreportssv.withColumn( // "InInvestigation", // when(col("nh_parentasbcase").isNull, "0").otherwise("1") // )
额外小提示:
- 用
col("列名")来引用列比df_asbreportssv("列名")更简洁,尤其当DataFrame变量名很长的时候。 - 如果后续要对
InInvestigation做统计(比如求和、计数),建议用数值类型的0和1,而不是字符串类型,这样操作更方便。
内容的提问来源于stack exchange,提问作者user13033419
相关产品推荐
相关产品推荐

