Scala 如何使用regexp替换Spark数据帧中的字符串

Scala 如何使用regexp替换Spark数据帧中的字符串,scala,apache-spark,Scala,Apache Spark,我在Spark中有一个数据帧,我想基于一个简单的正则表达式替换不同列的值,如果值以“\u p”结尾,则将其替换为“1”;如果值以“\u N”结尾,则将其替换为“-1”。我需要对多个列进行相同的替换。我还需要在结尾做一个转换。你可以通过“when('column.endsWith('u p'))、lit('1”)、when…”这样的表达式来完成。使用regexp\u replace也可以实现同样的效果。下面是一个使用when的示例: val myDf = sc.parallelize(Array(

我在Spark中有一个数据帧,我想基于一个简单的正则表达式替换不同列的值,如果值以“\u p”结尾,则将其替换为“1”;如果值以“\u N”结尾,则将其替换为“-1”。我需要对多个列进行相同的替换。我还需要在结尾做一个转换。

你可以通过“when('column.endsWith('u p'))、lit('1”)、when…”这样的表达式来完成。使用regexp\u 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”函数用于处理包含空值的行,因此,即使您尝试的方法有效,它也只能处理包含空值的行。除此之外,“replace”不适用于正则表达式,至少上次我检查时没有


干杯

您尝试了什么,为什么不起作用?我尝试了df.na.replace(列,地图(“[a-zA-Z0-9]”p“->“1”,“[a-zA-Z0-9]”N“->“-1”)。但不起作用