Как заменить значения столбца из кадра данных в пустую строку, если она полностью совпадает с регулярным выражением? - PullRequest
0 голосов
/ 02 июля 2018

Я должен написать очистить при совпадении компонент. Для этого я пытался использовать разные встроенные функции свечи

У меня есть оператор переключения для разных случаев

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 из ячейки, поскольку значение ячейки равно google.com.

Его следует заменять только при полном совпадении значений в ячейках столбца.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы не очень далеки от решения. Я могу предложить два способа заставить его работать.

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 (поэтому она была сопоставлена), то замените ее пустой строкой. В противном случае принимайте исходное значение столбца.

0 голосов
/ 02 июля 2018

Используйте "^ google.com $", если вы хотите сопоставить всю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...