我在Spark中有一个Dataframe,我想基于一个简单的正则表达式替换不同列的值,如果值以“_P”结尾,则将其替换为“1”,如果以“_N”结尾然后用“-1”替换它。我需要多个列来进行相同的替换。我还需要在最后做一个演员。
答案 0 :(得分:3)
你可以通过“when('column.endsWith(”_ P“),lit(”1“))等表达式来实现。使用regexp_replace可以实现同样的目的。以下是使用when:
的示例val myDf = sc.parallelize(Array(
("foo_P", "bar_N", "123"),
("foo_N", "bar_Y", "123"),
("foo", "bar", "123"),
("foo_Y", "bar_XX", "123")
)).toDF("col1", "col2", "col3")
val colsToReplace = Seq("col1", "col2")
import org.apache.spark.sql.Column
val castValues = (colName: String) => {
val col = new Column(colName)
when(col.endsWith("_P"), lit("1"))
.when(col.endsWith("_F"), lit("-1"))
.otherwise(col)
.as(colName)
}
val selectExprs = myDf.columns.diff(colsToReplace).map(new Column(_)) ++ colsToReplace.map(castValues)
myDf.select(selectExprs:_*).show
/*
+----+-----+------+
|col3| col1| col2|
+----+-----+------+
| 123| 1| bar_N|
| 123|foo_N| bar_Y|
| 123| foo| bar|
| 123|foo_Y|bar_XX|
+----+-----+------+
*/
修改强>
顺便说一句,关于你对你所尝试的内容的评论:“df.na”函数用于处理包含NULL值的行,因此,即使你尝试过的工作,它也只适用于包含空值的行。除此之外,“替换”不适用于正则表达式,至少我最后一次检查时没有。
干杯