如何将数据框的列值替换为与输入值匹配的空字符串?

时间:2018-07-02 10:41:18

标签: scala apache-spark dataframe

输入数据框

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函数以实现所需的结果。

2 个答案:

答案 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来实现这一目标。