Scala中如何实现DataFrame的条件列删除?
Scala中如何实现DataFrame的条件列删除?
嗨,作为Scala+Spark的新手,遇到这种条件删列的问题太正常啦~我来帮你一步步解决这个需求:你想要的是如果目标列存在就删除它,不存在就删除另一列,核心其实是先判断DataFrame里有没有指定的列,再决定删哪一个。
首先,我们可以先写一个简单的工具函数,用来检查列是否存在,新手用起来会更清晰:
import org.apache.spark.sql.DataFrame def columnExists(df: DataFrame, colName: String): Boolean = { df.columns.contains(colName) }
这个函数很简单,就是拿DataFrame的列名数组和目标列名做匹配,返回布尔值。
接下来,把你的foldLeft逻辑修改一下,加入条件判断。这里要注意:Spark的DataFrame是不可变的,而且我们要避免重复执行join操作(不然会浪费性能),所以可以先把join后的结果存成一个变量,再做判断:
val finalDf = yourList.foldLeft(mst) { (x, y) => // 先执行join操作,把结果存起来 val joinedDf = x.join(y.df, mergeWithTransformation(x, y), "cartesian") // 判断要删除的列:如果col1存在就删它,否则删你指定的另一列 val colToDrop = if (columnExists(joinedDf, "col1")) "col1" else "other_column_name" // 执行删除操作,返回新的DataFrame joinedDf.drop(colToDrop) }
记得把代码里的yourList替换成你实际用来foldLeft的集合,"other_column_name"替换成你要删除的备选列名称哦。
如果觉得单独写工具函数麻烦,也可以把判断逻辑直接内嵌进去,这样代码更紧凑:
val finalDf = yourList.foldLeft(mst) { (x, y) => val joinedDf = x.join(y.df, mergeWithTransformation(x, y), "cartesian") joinedDf.drop( if (joinedDf.columns.contains("col1")) "col1" else "other_column_name" ) }
原理和上面是一样的,只是把列检查的逻辑直接写在了drop方法里。
最后给你提个新手小提示:Spark的drop方法既支持传入列名字符串,也支持传入Column对象(比如y.df("col1")),但用字符串的话,配合columns.contains会更直接,不容易出错~
备注:内容来源于stack exchange,提问作者Insolent Goof
相关产品推荐
相关产品推荐

