У меня есть фрейм данных с текстовым столбцом и столбцом имени. Я хотел бы проверить, существует ли имя в текстовом столбце, и если оно существует, чтобы заменить его каким-либо значением. Я надеялся, что сработает следующее:
df = df.withColumn("new_text",regex_replace(col("text),col("name"),"NAME"))
но столбец не является итерируемым, поэтому он не работает. Должен ли я писать udf для этого? Как бы это выглядело?
Возможный дубликат Использование значения столбца в качестве параметра для искровой функции DataFrame
@giser_yugang, это pyspark, ваш связанный вопрос касается scala.
Вы почти рядом. Вот подробный пример с опциями withColumn
и selectExpr
:
Образец д.ф.
df = spark.createDataFrame([('This is','This'),
('That is','That'),
('That is','There')],
['text','name'])
#+-------+-----+
#| text| name|
#+-------+-----+
#|This is| This|
#|That is| That|
#|That is|There|
#+-------+-----+
Опция 1:withColumn
с помощью функции expr
from pyspark.sql.functions import expr, regexp_replace
df.withColumn("new_col1",expr("regexp_replace(text,name,'NAME')")).show()
#+-------+-----+--------+
#| text| name|new_col1|
#+-------+-----+--------+
#|This is| This| NAME is|
#|That is| That| NAME is|
#|That is|There| That is|
#+-------+-----+--------+
Вариант 2:selectExpr
с помощью regexp_replace
from pyspark.sql.functions import regexp_replace
df.selectExpr("*",
"regexp_replace(text,name,'NAME') AS new_text").show()
#+-------+-----+--------+
#| text| name|new_text|
#+-------+-----+--------+
#|This is| This| NAME is|
#|That is| That| NAME is|
#|That is|There| That is|
#+-------+-----+--------+
Вы случайно не знаете, как обрабатывать случай, когда имя является регулярным выражением? Я вижу проблему с expr("regexp_replace(column, 'regex', 'replace_value')")
Чтобы добавить, это потому, что «регулярное выражение» является регулярным выражением, но кажется, что оно окружено строкой из expr.
Я думаю, что решил это, но не уверен, почему. ^([^.]+)?\\. работало вместо ^.*?\\. (но последний работает, когда я не использую expr)
Возможный дубликат stackoverflow.com/questions/45615621/…