Spark Scala DataFrame如何从列名列表获取值生成动态去重键
Spark动态拼接多列生成去重键解决方案
核心实现逻辑
你只需要将存储去重列名的列表,通过map操作转换为Spark的Column引用序列,再通过:_*语法将序列展开作为concat函数的入参,即可适配任意长度的去重键列表。
完整代码示例
import org.apache.spark.sql.functions._ // 你的动态去重列名列表,长度任意,支持1/2/3个或更多列 val lst = List("section_xid", "learner_xid") // 将列名列表转换为Column引用序列 val dedupColSeq = lst.map(col(_)) // 若lst本身存储的就是Column类型对象,不需要做map转换,直接使用lst即可 // 动态生成去重键 val resultDf = df.withColumn( "dedup_key_sk", uuid(md5(concat(dedupColSeq:_*))) )
优化建议
如果去重列存在空值,直接使用concat会导致拼接结果整体为空,建议使用concat_ws指定列中不会出现的特殊分隔符,避免空值影响去重准确性:
val resultDf = df.withColumn( "dedup_key_sk", uuid(md5(concat_ws("|~|", dedupColSeq:_*))) )
常见错误说明
- 之前写法
$"lst(0)"是错误用法,该语法会尝试读取名为lst(0)的列,而非读取lst列表中第一个元素对应的列 - 将lst列表转成DF的操作和获取列引用的需求无关,不需要使用该逻辑
内容的提问来源于stack exchange,提问作者PriyalChaudhari
相关产品推荐
相关产品推荐

