заменить специальный символ в датафрейме pyspark? - PullRequest
1 голос
/ 16 апреля 2020

У меня есть столбец со значением * NZ, я хочу удалить *,

df.groupBy('State1').count().show()
(5) Spark Jobs
+-----------+-----+
|     State1|count|
+-----------+-----+
|         NT| 1423|
|        ACT| 2868|
|         SA|12242|
|        TAS| 4603|
|         WA|35848|
|        *NZ|  806|
|        QLD|44410|
|    missing| 2612|
|        VIC|40607|
|        NSW|45195|
+-----------+-----+

Я пробовал эти два

df = df.select("State1", f.translate(f.col("State1"), "*", ""))
df = df.withColumn('State1', regexp_replace('State1', '*',''))

Первый код ничего не делает

Второй код работает, но когда я показываю ошибку броска

df.groupBy('State1').count().show()

Py4JJavaError                             Traceback (most recent call last)
org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 725.0 failed 1 times, most recent failure: Lost task 1.0 in stage 725.0 (TID 13480, localhost, executor driver): java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0

Как заменить *

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Это сработало

from pyspark.sql.functions import UserDefinedFunction
udf = UserDefinedFunction(lambda x: x.replace("*",""), StringType())
df = df.withColumn("State1", udf(col("State1")))
1 голос
/ 16 апреля 2020

Вы можете сделать это с помощью regexp_replace на "\*":

from pyspark.sql import functions as F
df.withColumn("State1", F.regexp_replace("State1","\*","")).show()

+-------+-----+
| State1|count|
+-------+-----+
|     NT| 1423|
|    ACT| 2868|
|     SA|12242|
|    TAS| 4603|
|     WA|35848|
|     NZ|  806|
|    QLD|44410|
|missing| 2612|
|    VIC|40607|
|    NSW|45195|
+-------+-----+

Как указано в комментариях @mazaneicha. Вы также можете использовать replace.

from pyspark.sql import functions as F
df.withColumn("State1", F.expr("""replace(state1,'*')""")).show()
0 голосов
/ 16 апреля 2020

Поскольку * имеет специальное значение (подстановочный знак), следуйте этому подходу

from pyspark.sql import functions as F
>>> df2 = df.withColumn("CleanState",F.regexp_replace("State","\*",""))
>>> df2.show()
+-------+-----+----------+
|  State|count|CleanState|
+-------+-----+----------+
|     NT| 1423|        NT|
|   A*CT| 2868|       ACT|
|     SA|12242|        SA|
|    TAS| 4603|       TAS|
|     WA|35848|        WA|
|    *NZ|  806|        NZ|
|   QLD*|44410|       QLD|
|missing| 2612|   missing|
|    VIC|40607|       VIC|
|    NSW|45195|       NSW|
+-------+-----+----------+

enter image description here

...