Вы можете использовать regexp_replace
, чтобы сделать это вместо udf, это должно быть намного быстрее. В большинстве случаев вы можете использовать отрицательное предположение в регулярном выражении, но для «+ apple» вы на самом деле хотите заменить «+» на «» (а не пробел). Самый простой способ - просто использовать регулярные выражения.
df.withColumn("newCol", regexp_replace($"value", "^\\+", ""))
.withColumn("newCol", regexp_replace($"newCol", "\\+(?!\\+|$)", " "))
Это даст:
+--------------------+--------------------+
|value |newCol |
+--------------------+--------------------+
|apple+case |apple case |
|apple+case+10+cover |apple case 10 cover |
|apple+case+10++cover|apple case 10+ cover|
|+apple |apple |
|iphone8+ |iphone8+ |
+--------------------+--------------------+
Чтобы сделать это более модульным и многократно используемым, вы можете определить его как функцию :
def normalizer(c: String) = regexp_replace(regexp_replace(col(c), "^\\+", ""), "\\+(?!\\+|$)", " ")
df.withColumn("newCol", normalizer("value"))