我已经找到了一些类似的解决方案,但是没有一个能够完全完成我想做的事情。我有一组要用于字符串替换的键/值对。例如
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 "," "))
答案 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”)