Spark: как удалить ненужные символы в значениях столбца df - PullRequest
0 голосов
/ 27 января 2019

У меня df вот так,

+----+---+
| _c0|_c1|
+----+---+
|('a'| 2)|
|('b'| 4)|
|('c'| 6)|
+----+---+

Я хочу, как показано ниже,

+----+---+
| _c0|_c1|
+----+---+
| a  | 2 |
| b  | 4 |
| c  | 6 |
+----+---+

Если я попытаюсь вот так получить ошибку

df1.select(regexp_replace('_c0', "('", "c")).show()

Произошла ошибка при вызове o789.showString. : org.apache.spark.SparkException: задание прервано из-за сбоя этапа: Задача 1 на этапе 71.0 не выполнена 1 раз, последний сбой: потерянная задача 1.0 на этапе 71.0 (TID 184, localhost, драйвер исполнителя): java.util.regex.PatternSyntaxException: незамкнутая группа рядом с индексом 2

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Как сказал другой пользователь, необходимо экранировать специальные символы, такие как скобки, с обратной косой чертой. Здесь вы можете найти список специальных символов регулярных выражений.Следующий код использует два разных подхода к вашей проблеме.С помощью regexp_extract мы извлекаем один символ между ('и' в столбце _c0. С regexp_replace мы заменим) во втором столбце.Конечно, вы можете использовать только функцию regexp_replace с регулярным выражением "[() ']" для достижения того, что вы хотели.Я просто хочу показать вам два различных способа решения проблемы.

from pyspark.sql import functions as F
columns = ['_c0', '_c1']
vals = [("('a'", "2)"),("('b'", "4)"),("('c'", "6)")]

df = spark.createDataFrame(vals, columns)
df = df.select(F.regexp_extract('_c0', "\('(\w)'", 1).alias('_c0')
             , F.regexp_replace("_c1", "\)", "").alias('_c1'))
df.show()

Вывод:

+---+---+ 
|_c0|_c1| 
+---+---+ 
|  a|  2| 
|  b|  4| 
|  c|  6| 
+---+---+
0 голосов
/ 27 января 2019

Вы должны выйти за скобки:

df1.select(regexp_replace('_c0', "\\('", "c")).show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...