Spark dataframe - заменить все значения из списка ключ / значение в Scala - PullRequest
0 голосов
/ 17 сентября 2018

Я нашел несколько похожих решений, но ни одно из них не достигло именно того, что я хочу.У меня есть набор пар ключ / значение, которые я хочу использовать для подстановки строк.Например,

val replacements = Map( "STREET" -> "ST", "STR" -> "ST")

Я читаю таблицу в кадре данных, и я хотел бы изменить столбец, чтобы заменить все экземпляры ключа в моей карте их значениями.Итак, на приведенной выше карте посмотрите на столбец «улица» и замените все значения «STREET» на «ST», а все значения «STR» на «ST» и т. Д.

Я смотрел нанекоторые реализации foldLeft, но не смогли заставить его работать.

Базовое решение было бы замечательно, но оптимальным решением было бы то, что я мог бы подключить к функции Column, которую кто-то написал, на которую я надеялсяобновлять.Конкретно такая строка:

val CleanIt: Column = trim(regexp_replace(regexp_replace(regexp_replace(colName," OF "," ")," AT "," ")," AND "," "))

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете создать этот вспомогательный метод, который преобразует данный столбец и карту замен в новое Column выражение:

def withReplacements(column: Column, replacements: Map[String, String]): Column = 
  replacements.foldLeft[Column](column) {
    case (col, (from, to)) => regexp_replace(col, from, to)
  }

Затем используйте его в столбце street с картой replacements:

val result = df.withColumn("street", withReplacements($"street", replacements))

Например:

df.show()
// +------------+------+
// |      street|number|
// +------------+------+
// | Main STREET|     1|
// |Broadway STR|     2|
// |     1st Ave|     3|
// +------------+------+

result.show()
// +-----------+------+
// |     street|number|
// +-----------+------+
// |    Main ST|     1|
// |Broadway ST|     2|
// |    1st Ave|     3|
// +-----------+------+

ПРИМЕЧАНИЕ : ключи на карте должны быть действительными регулярными выражениями. Это означает, например, что если вы хотите заменить строку "St." на "ST", вы должны использовать Map("St\\." -> "ST) (экранирование от точки, которая в противном случае будет интерпретирована как регулярное выражение "any")

...