Databricks Scala中如何从when语句生成结构体数组
解决方案
直接通过array构造结构体数组,结合filter剔除未触发校验规则的空值,替代原来的concat_ws+split方案。
实现代码
import org.apache.spark.sql.functions._ val resultDF = employees .withColumn( "record_validity", filter( array( // 规则1:employmentPeriod为负 when($"employmentPeriod" < 0, struct( lit("corrupt").alias("validationCategory"), lit("date-negative-period").alias("validationError") ) ), // 规则2:入职和离职日期都为空 when($"deactivationDate".isNull && $"hiredDate".isNull, struct( lit("corrupt").alias("validationCategory"), lit("date-missing").alias("validationError") ) ), // 规则3:synthetic_hiredDate为空 when($"synthetic_hiredDate".isNull, struct( lit("corrupt").alias("validationCategory"), lit("date-deactivated-after-creation").alias("validationError") ) ), // 规则4:入职日期为空 when($"hiredDate".isNull, struct( lit("corrupt").alias("validationCategory"), lit("date-missing-hire-date").alias("validationError") ) ), // 规则5:在职状态且无离职日期 when($"deactivationDate".isNull && $"employment" === "active", struct( lit("valid").alias("validationCategory"), lit("implicit").alias("validationError") ) ) ), // 过滤数组中的null值(未触发的规则会返回null) x => x.isNotNull ) )
关键说明
- 每个
when直接返回struct类型,明确指定validationCategory和validationError字段的取值,无需再通过字符串拆分转换。 - 使用
array将所有校验规则的结果打包成数组,再通过filter移除数组中未触发规则产生的null元素,避免无效值混入结果。 - 相比原方案,这种方式直接构造目标数据结构,避免了字符串拼接和拆分的额外开销,也更符合Spark的类型安全特性。
输出示例
[ {"validationCategory":"corrupt","validationError":"date-missing"}, {"validationCategory":"corrupt","validationError":"date-deactivated-after-creation"}, {"validationCategory":"corrupt","validationError":"date-missing-hire-date"} ]
内容的提问来源于stack exchange,提问作者lloyd
相关产品推荐
相关产品推荐

