输入数据框
val ds = Seq((1,"play Framwork"),
(2,"Spark framework"),
(3,"spring framework")).toDF("id","subject")
期望的数据帧
val ds = Seq((1,""),
(2,"Spark framework"),
(3,"spring framework")).toDF("id","subject")
如果我的搜索字符串为play Framwork
,则将值play Framwork
替换为空字符串。
如果我的搜索字符串为play
,则不应替换单元格中的值。
当我使用以下功能时
def replaceUsingRegEx(dataset: DataFrame, ColumnToBeTransformed: String, searchString: String): DataFrame = {
dataset.withColumn(ColumnToBeTransformed, regexp_replace(col(ColumnToBeTransformed), "(?i)" + searchString, ""))
}
它实际上是将值 play 替换为空,如下所示。
val ds = Seq((1," Framwork"),
(2,"Spark framework"),
(3,"spring framework")).toDF("id","subject")
这不是预期的行为。我只想在搜索字符串与单元格值完全匹配时才替换单元格值。
如何修改regexp_replace
函数以实现所需的结果。
答案 0 :(得分:1)
我只想在搜索字符串与单元格值完全匹配时替换单元格值。
您可以将regexp_replace
函数用作
when/otherwise
函数
def replaceUsingRegEx(dataset: DataFrame, ColumnToBeTransformed: String, searchString: String): DataFrame = {
dataset.withColumn(ColumnToBeTransformed, when(col(ColumnToBeTransformed) === searchString, "").otherwise(col(ColumnToBeTransformed)))
}
因此将函数调用为
replaceUsingRegEx(ds, "subject", "play Framwork").show(false)
应该给您
+---+----------------+
|id |subject |
+---+----------------+
|1 | |
|2 |Spark framework |
|3 |spring framework|
+---+----------------+
请注意,上面的函数区分大小写,如果您想忽略区分大小写的,则可以等于小写字母
def replaceUsingRegEx(dataset: DataFrame, ColumnToBeTransformed: String, searchString: String): DataFrame = {
dataset.withColumn(ColumnToBeTransformed, when(lower(col(ColumnToBeTransformed)) === searchString.toLowerCase, "").otherwise(col(ColumnToBeTransformed)))
}
我希望答案会有所帮助
答案 1 :(得分:0)
def replaceUsingRegEx(数据集:DataFrame,ColumnToBeTransformed:字符串,searchString:字符串):DataFrame = { dataset.withColumn(ColumnToBeTransformed,regexp_replace(col(ColumnToBeTransformed),searchString,“”))
尽管在您的方案中没有必要使用reg ex,但是您可以使用条件语句来代替。但是根据您的要求,您可以使用reg ex来实现这一目标。