如何使用regexp

时间:2016-09-13 15:36:34

标签: scala apache-spark

我在Spark中有一个Dataframe,我想基于一个简单的正则表达式替换不同列的值,如果值以“_P”结尾,则将其替换为“1”,如果以“_N”结尾然后用“-1”替换它。我需要多个列来进行相同的替换。我还需要在最后做一个演员。

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值的行,因此,即使你尝试过的工作,它也只适用于包含空值的行。除此之外,“替换”不适用于正则表达式,至少我最后一次检查时没有。

干杯