Spark Scala:如何基于列列表计算多列的MD5哈希值
解决Spark Scala中concat_ws传入列名列表报错的问题
报错根源是代码里错误地将列名列表当作单个列名处理了。$"businessCols"会尝试从DataFrame中查找名为businessCols的列,而非把列表内的每个元素转换为对应的Column对象,这与concat_ws要求的Seq[Column]参数类型不匹配。
修正后的代码
import org.apache.spark.sql.functions._ val businessCols = List("fname", "lname") // 修正原代码中表名重复的问题:应该是数据库名.表名 val df = spark.table(s"{databaseName}.${tableName}") val new_df = df .withColumn("concatenated_cols", concat_ws(",", businessCols.map(col): _*)) .withColumn("md5_hash", md5($"concatenated_cols"))
核心修正点
businessCols.map(col):将字符串类型的列名列表转换为Column对象序列,这才是concat_ws所需的参数类型- 也可以用
businessCols.map($"_")替代map(col),两者效果一致 - 顺带修复了原代码的小失误:
spark.table的参数应该是数据库名加表名,而非重复写数据库名
如果不需要保留中间的concatenated_cols列,还可以简化为一步操作:
val new_df = df.withColumn( "md5_hash", md5(concat_ws(",", businessCols.map(col): _*)) )
内容的提问来源于stack exchange,提问作者Gaurang Shah
相关产品推荐
相关产品推荐

