Scala中比较DataFrame两字符串列值的实现报错排查
解决Spark Scala中DataFrame字符串列大小写不敏感比较的问题
问题说明
在DataFrame的两个字符串列x和y上需要实现以下逻辑:
- 大小写不敏感比较两列值,若相同则返回
x的值 - 若不同则将
x和y用.拼接后返回
已实现SQL版本,但Scala代码运行报错:
error: type mismatch; found : Boolean required: org.apache.spark.sql.Column
SQL实现代码:
select (case when x = y then x else concat(x || '. ' || y) end) as match from test
(注:Spark SQL中字符串连接建议用||,原代码的+写法并非标准字符串连接符)
Scala错误代码:
df.select(when(col("x") == col("y"), col("x") ) .otherwise(concat(col("x"),lit('. '), col("y"))) .as("match"))
错误原因
在Spark Scala API中,直接用==比较两个Column对象会返回Boolean类型,但when函数的第一个参数要求是Column类型的布尔表达式,这就导致了类型不匹配。另外原代码还未实现大小写不敏感的比较逻辑。
正确实现方式
方式1:equalTo方法+大小写转换
先将两列统一转为小写(或大写),再用equalTo做列间相等判断:
import org.apache.spark.sql.functions.{col, concat, lit, lower, when} df.select( when(lower(col("x")).equalTo(lower(col("y"))), col("x")) .otherwise(concat(col("x"), lit(". "), col("y"))) .alias("match") )
方式2:===运算符+大小写转换
Spark提供的===运算符专门用于Column间的相等比较,返回符合要求的Column类型表达式,结合大小写转换实现需求:
import org.apache.spark.sql.functions.{col, concat, lit, lower, when} df.select( when(lower(col("x")) === lower(col("y")), col("x")) .otherwise(concat(col("x"), lit(". "), col("y"))) .alias("match") )
关键说明
lower(col("x"))将列值转为小写,确保比较时忽略大小写差异equalTo或===用于Column之间的相等判断,返回when需要的Column类型布尔表达式concat配合lit(". ")实现字符串拼接,添加指定分隔符
内容的提问来源于stack exchange,提问作者P201_eng
相关产品推荐
相关产品推荐

