Spark Scala中DataFrame join select操作如何使用NVL函数
Spark Scala 左连接场景下实现字段空值默认填充
你可以直接使用Spark内置的nvl函数实现需求,步骤如下:
- 先导入需要的SQL函数依赖
import org.apache.spark.sql.functions.nvl - 在select语句中直接对
df2.name字段套入nvl逻辑即可,修改后的完整代码如下:df1.join(df2, df1("id") === df2("id"), "left") .select( df1("id"), nvl(df2("name"), "test").alias("name") )
其他等价实现方案
如果习惯用其他写法,以下两种方式也能实现完全相同的效果:
- 用
coalesce函数(返回参数列表中第一个非null值,适合多字段依次兜底的场景)
注意:import org.apache.spark.sql.functions.{coalesce, lit} df1.join(df2, df1("id") === df2("id"), "left") .select( df1("id"), coalesce(df2("name"), lit("test")).alias("name") )coalesce要求所有入参都是Column类型,字符串常量需要用lit()包装成列对象。 - 用
when/otherwise条件判断(适合需要叠加更多判断逻辑的场景)import org.apache.spark.sql.functions.when df1.join(df2, df1("id") === df2("id"), "left") .select( df1("id"), when(df2("name").isNull, "test") .otherwise(df2("name")) .alias("name") )
注意事项
- 左连接时df2无匹配id的记录,df2所有字段都会返回null,上述三种写法都能正确命中兜底逻辑返回"test"
- 空值处理后建议用
.alias()指定列名,避免函数生成的默认列名影响后续计算 - 所有Spark SQL内置函数都需要从
org.apache.spark.sql.functions包导入后使用
内容的提问来源于stack exchange,提问作者CompEng
相关产品推荐
相关产品推荐

