我有一个包含20列的数据框,在这些列中有一个值XX,我想用空字符串替换。我如何在scala中实现这一点。 withColumn函数用于单个列,但是我希望传递所有20个列并用空字符串替换整个帧中具有XX的值,有人可以提示一种方法。
由于
答案 0 :(得分:2)
您可以收集列表中的所有stringType
列,并使用foldLeft
将removeXX
UDF应用于每个列,如下所示:
val df = Seq(
(1, "aaXX", "bb"),
(2, "ccXX", "XXdd"),
(3, "ee", "fXXf")
).toDF("id", "desc1", "desc2")
import org.apache.spark.sql.types._
val stringColumns = df.schema.fields.collect{
case StructField(name, StringType, _, _) => name
}
val removeXX = udf( (s: String) =>
if (s == null) null else s.replaceAll("XX", "")
)
val dfResult = stringColumns.foldLeft( df )( (acc, c) =>
acc.withColumn( c, removeXX(df(c)) )
)
dfResult.show
+---+-----+-----+
| id|desc1|desc2|
+---+-----+-----+
| 1| aa| bb|
| 2| cc| dd|
| 3| ee| ff|
+---+-----+-----+
答案 1 :(得分:0)
def clearValueContains(dataFrame: DataFrame,token :String,columnsToBeUpdated : List[String])={
columnsToBeUpdated.foldLeft(dataFrame){
(dataset ,columnName) =>
dataset.withColumn(columnName, when(col(columnName).contains(token), "").otherwise(col(columnName)))
}
}
您可以使用此功能..在其中可以将令牌设置为“ XX”。另外,columnsToBeUpdated是列列表,您需要在其中搜索特定列。
dataset.withColumn(columnName, when(col(columnName) === token, "").otherwise(col(columnName)))
您可以使用上面的代码替换完全匹配。