Spark数据框-替换Scala中的键/值列表中的所有值

时间:2018-09-17 18:26:59

标签: scala apache-spark replace

我已经找到了一些类似的解决方案,但是没有一个能够完全完成我想做的事情。我有一组要用于字符串替换的键/值对。例如

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 :(得分:2)

您可以创建此帮助程序方法,该方法将给定的列和替换映射转换为新的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”)