Spark中如何将多个when条件整合到Map中替代Select语句?
实现方法
可以通过map_from_arrays构建模板值与B表列值的映射关系,替代大量when条件,具体步骤如下:
1. 定义模板与列的对应关系
将25个模板值和对应的B表列分别存入两个数组,对应位置严格保持一致:
// 模板值数组,按顺序对应B表的列 val templateList = Array("some_value", "some_value1", "some_value2", /* ... 剩余22个模板值 */) // 对应B表的列数组,顺序与templateList严格匹配 val bColumnList = Array(B.new_value, B.new_value1, B.new_value2, /* ... 剩余22个B表列 */)
2. 构建映射Map
用map_from_arrays将模板值数组和B列数组转换为Map结构,键是模板值,值是对应B列的实际数据:
val templateToValueMap = map_from_arrays(lit(templateList), array(bColumnList: _*))
3. 替换原有的when逻辑
在select中通过Map的getItem方法根据A表的template取值,用coalesce处理默认值(当Map中无匹配键时,返回B表的some_value3):
A.join(B, condition, "left") .select( coalesce(templateToValueMap.getItem(A.template), B.some_value3).alias("new_value") )
原理说明
你之前尝试的B[my_map.getItem(A.rate_template)]无法生效,是因为my_map.getItem返回的是列的数值,而B[]需要传入列名字符串。上面的方法直接把B列的数值存入Map,通过模板值匹配后直接返回对应数值,避免了列名动态引用的问题。
内容的提问来源于stack exchange,提问作者Prarthana Sawant
相关产品推荐
相关产品推荐

