Похоже на проблему CRLF (a.k.a. \ r \ n).
Исторически, один используется для указания консоли вернуться в начало строки, а другой - для создания новой строки.
Здесь, кажется, вы подавили создание новой строки, но все еще имеете часть "вернуться в начало".
Поэтому я предлагаю вам заменить оба \r
и \n
.
См. Википедия о CR
Возврат каретки, иногда известный как возврат картриджа и часто сокращенный до CR, или возврат, является управляющим символом или механизмом, используемым для сброса положения устройства в начале строки текста. Он тесно связан с концепциями перевода строки и новой строки, хотя его можно рассматривать отдельно по отдельности.
Чтобы увидеть его в действии, давайте создадим тестовый фрейм данных:
scala> val dataframe = Seq(
("normal", "normal"),
("withLF", "normal\n"),
("withCRLF", "normal\r\n")).toDF("id", "value")
dataframe: org.apache.spark.sql.DataFrame = [id: string, value: string]
scala> dataframe.show
+--------+--------+
| id| value|
+--------+--------+
| normal| normal|
| withLF| normal
|
|withCRLF|normal
|
+--------+--------+
Здесь мы видим, что у наших строк с "\ r \ n" и "\ n" есть проблема, с которой вы столкнулись в начале вашего поста.
Теперь, если я использую, вы замените функцию:
dataframe.withColumn("value", regexp_replace($"value", "\n", "")).show
+--------+-------+
| id| value|
+--------+-------+
| normal| normal|
| withLF| normal|
|withCRLF|normal
+--------+-------+
Мы видим, что решили ситуацию "\ n", но не "\ r \ n". Так что если вы действительно хотите использовать регулярное выражение для поиска / замены, вы должны объявить CR и LF для замены:
scala> dataframe.withColumn("value", regexp_replace($"value", "[\r\n]+", " ")).show
+--------+-------+
| id| value|
+--------+-------+
| normal| normal|
| withLF|normal |
|withCRLF|normal |
+--------+-------+
(Возможные улучшения: не использовать регулярное выражение для замены одного символа. Не выводить пустой символ в конце строки вывода, ...).