如何从Spark数据框中删除与正则表达式匹配的行

时间:2018-07-03 11:50:40

标签: scala apache-spark dataframe

输入数据框

import spark.implicits._

val ds = Seq((1,"play Framwork"),
  (2,"Spark framework"),
  (3,"spring framework")).toDF("id","subject")

我可以使用任何 regex ,并且我的函数应该从与正则表达式令牌匹配的数据框中remove those rows开始。

假设我的 regex ^ play。* ,那么我的函数应该删除第一行并产生以下结果。

val exp = Seq((2,"Spark framework"),
  (3,"spring framework")).toDF("id","subject")

我当时正在考虑使用如下所示的功能

def clearValueUsingRegex(dataFrame: DataFrame, token: String, columnsToBeUpdated: List[String]) = {
Logger.debug(s"Inside clearValueUsingRegex : token :$token , columnsToBeUpdated : $columnsToBeUpdated")
if (isValidRegex(token)) {
  columnsToBeUpdated.foldLeft(dataFrame) {
    (dataset, columnName) =>
      dataset.withColumn(columnName, regexp_replace(col(columnName), token, ""))
  }
} else {
  throw new NotValidRegularExpression(s"$token is not valid regex.")
}

}

但是此函数的问题在于它仅替换特定的单元格值,而不删除作为我预期结果的完整行。

1 个答案:

答案 0 :(得分:0)

您可以使用过滤器功能。

df.filter($"columnName" rlike "^play.*")

http://spark.apache.org/docs/2.3.0/api/java/index.html?org/apache/spark/sql/Dataset.html