我必须写一个匹配清除组件。为此,我试图使用内置的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, ""))
}
}
匹配的单词替换为该值。但是,我期望只有在正则表达式完全匹配单元格值时,才会用空字符串替换单元格值。
例如,如果regex
为token
并且我的单元格值为.com
,则由于单元格值为google.com
,因此不应替换单元格中的.com
。
仅当与列单元格中的值完全匹配时才应替换。
答案 0 :(得分:0)
如果要匹配整个字符串,请使用“ ^ google.com $”。
答案 1 :(得分:0)
您离解决方案不远。我可以提出两种使之起作用的方法。
创建一个用户定义的函数,该函数将正则表达式与单元格值进行匹配:
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(因此已匹配),然后将其替换为空字符串。否则,请采用原始列值。