如果它与正则表达式完全匹配,如何将数据框中的列值替换为空字符串?

时间:2018-07-02 13:50:43

标签: scala apache-spark dataframe

我必须写一个匹配清除组件。为此,我试图使用内置的functions

内置的不同spark

我有一个针对不同情况的switch语句

onNestedPreScroll

val operator = operatorAndTokenTuple._1 val token = operatorAndTokenTuple._2 operator match { case "equals" => clearValueEquals(ds,token,columnsToBeUpdated) case "contains" =>clearValueContains(ds,token,columnsToBeUpdated) case "starts_with" => clearValueStartsWith(ds,token,columnsToBeUpdated) case "ends_with" => clearValueEndsWith(ds,token,columnsToBeUpdated) case "regex" => clearValueUsingRegex(ds,token,columnsToBeUpdated) case _ => throw new OperatorNotFoundException(s"${operatorAndTokenTuple._1} not applicable") } 之外,我已经实现了所有情况。我写了下面的函数

regex

上述功能的问题在于,它将与def clearValueUsingRegex(dataFrame: DataFrame,token :String,columnsToBeUpdated : List[String])= { columnsToBeUpdated.foldLeft(dataFrame) { (dataset ,columnName) => dataset.withColumn(columnName,regexp_replace(col(columnName),token, "")) } } 匹配的单词替换为该值。但是,我期望只有在正则表达式完全匹配单元格值时,才会用空字符串替换单元格值。

例如,如果regextoken并且我的单元格值为.com,则由于单元格值为google.com,因此不应替换单元格中的.com

仅当与列单元格中的值完全匹配时才应替换。

2 个答案:

答案 0 :(得分:0)

如果要匹配整个字符串,请使用“ ^ google.com $”。

答案 1 :(得分:0)

您离解决方案不远。我可以提出两种使之起作用的方法。

UDF

创建一个用户定义的函数,该函数将正则表达式与单元格值进行匹配:

private def replaceWithEmptyIfMatch(token: String) = udf((value: String) => {
  if (value.matches(token)) "" else value
})

并从clearValueUsingRegex调用它:

... => 
dataset.withColumn(columnName, replaceWithEmptyIfMatch(token)(col(columnName)))

列表达式

在具有匹配值的列上使用稍微复杂一些的表达式:

... => 
dataset.withColumn(columnName, 
                   when(length(regexp_extract(col(columnName), token, 0)) > 0, "")
                   .otherwise(col(columnName)))

说明:与regexp_extract匹配的第一组的长度大于0(因此已匹配),然后将其替换为空字符串。否则,请采用原始列值。