pyspark заменяет несколько значений на ноль в датафрейме - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть фрейм данных (df) , а внутри фрейма данных у меня есть столбец user_id

df = sc.parallelize([(1, "not_set"),
                     (2, "user_001"),
                     (3, "user_002"),
                     (4, "n/a"),
                     (5, "N/A"),
                     (6, "userid_not_set"),
                     (7, "user_003"),
                     (8, "user_004")]).toDF(["key", "user_id"])

df:

+---+--------------+
|key|       user_id|
+---+--------------+
|  1|       not_set|
|  2|      user_003|
|  3|      user_004|
|  4|           n/a|
|  5|           N/A|
|  6|userid_not_set|
|  7|      user_003|
|  8|      user_004|
+---+--------------+

Я хотел бы заменить следующие значения: not_set, n / a, N / A и userid_not_set на null.

Было бы хорошо, если бы я мог добавить любые новые значения в списоки они могут быть изменены.

В настоящее время я использую оператор CASE в spark.sql , чтобы предварительно преобразовать это, и хотел бы изменить его на pyspark.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

None внутри функции when() соответствует null.В случае, если вы хотите заполнить что-то еще вместо null, вы должны заполнить это вместо него.

from pyspark.sql.functions import col    
df =  df.withColumn(
    "user_id",
    when(
        col("user_id").isin('not_set', 'n/a', 'N/A', 'userid_not_set'),
        None
    ).otherwise(col("user_id"))
)
df.show()
+---+--------+
|key| user_id|
+---+--------+
|  1|    null|
|  2|user_001|
|  3|user_002|
|  4|    null|
|  5|    null|
|  6|    null|
|  7|user_003|
|  8|user_004|
+---+--------+
0 голосов
/ 31 декабря 2018

ПФБ мало подходит.Я предполагаю, что все допустимые идентификаторы пользователей начинаются с "user_".Пожалуйста, попробуйте следующий код.

from pyspark.sql.functions import *
df.withColumn(
    "user_id",
    when(col("user_id").startswith("user_"),col("user_id")).otherwise(None)
).show()

Еще один.

cond = """case when user_id in ('not_set', 'n/a', 'N/A', 'userid_not_set') then null
                else user_id
            end"""

df.withColumn("ID", expr(cond)).show()

Еще один.

cond = """case when user_id like 'user_%' then user_id
                else null
            end"""

df.withColumn("ID", expr(cond)).show()

Еще один.

df.withColumn(
    "user_id",
    when(col("user_id").rlike("user_"),col("user_id")).otherwise(None)
).show()
0 голосов
/ 21 декабря 2018

Вы можете использовать встроенную функцию when, которая эквивалентна выражению case.

from pyspark.sql import functions as f
df.select(df.key,f.when(df.user_id.isin(['not_set', 'n/a', 'N/A']),None).otherwise(df.user_id)).show()

Также необходимые значения могут храниться в list и ссылаться на них..

val_list = ['not_set', 'n/a', 'N/A']
df.select(df.key,f.when(df.user_id.isin(val_list),None).otherwise(df.user_id)).show()
...