Обработка нулевого значения в фрейме данных pyspark - PullRequest
1 голос
/ 17 октября 2019

У меня есть pyspark dataframe с некоторыми данными, и я хочу substring некоторые данные столбца, этот столбец также содержит некоторое значение null. вот мой фрейм данных

+-------------+
|          Name|
+--------------+
| Asia201909284|
|    US20190928|
|Europ201909287|
|          null|
|     something|
|       nothing|
+--------------+

все, что я хочу удалить Asia, US, Europ из столбца Name

Вот мой код, который я уже пробовал.

fun_asia = udf(lambda x: x[4:len(x)])
fun_us = udf(lambda x: x[2:len(x)])
fun_europ = udf(lambda x: x[5:len(x)])
df1.withColumn("replace", \
               when(df1.Name.isNull(),df1.Name)\
               .when(df1.Name.like("Asia%"),fun_asia(col('Name')))\
               .when(df1.Name.like("US%"),fun_us(col('Name')))\
               .when(df1.Name.like("Europ%"),fun_europ(col('Name')))
               .otherwise(df1.Name)
              ).show()

Работает нормально, если в этом столбце нет значения null. но если есть какое-то значение null, оно выдает ошибку, такую ​​как len() не может вычислить нулевое значение.

Ошибка массажа

TypeError: object of type 'NoneType' has no len()

Вещи, которые я запутал, почемуэто вызывает удовольствие также для null значение. и как я могу преодолеть свою проблему и получить желаемый результат, любую помощь, оцените.

Фактический результат, который я хочу

+--------------+---------+
|          Name|  replace|
+--------------+---------+
| Asia201909284|201909284|
|    US20190928| 20190928|
|Europ201909287|201909287|
|          null|     null|
|     something|something|
|       nothing|  nothing|
+--------------+---------+

1 Ответ

1 голос
/ 17 октября 2019

Одним из подходов является использование when с условием isNull() для обработки условия when column is null:

df1.withColumn("replace", \
               when(df1.Name.like("Asia%"),fun_asia(col('Name')))\
               .when(df1.Name.like("US%"),fun_us(col('Name')))\
               .when(df1.Name.like("Europ%"),fun_europ(col('Name')))
               .when(df1.Name.isNull(), df1.Name)
               .otherwise(df1.Name)
              ).show()

EDIT2:

Вы можете изменить свой udf для обработкинули:

fun_asia = udf(lambda x: x[4:len(x)] if x else None)
fun_us = udf(lambda x: x[2:len(x)] if x else None)
fun_europ = udf(lambda x: x[5:len(x)] if x else None)
df1.withColumn("replace", \
               when(df1.Name.isNull(),df1.Name)\
               .when(df1.Name.like("Asia%"),fun_asia(col('Name')))\
               .when(df1.Name.like("US%"),fun_us(col('Name')))\
               .when(df1.Name.like("Europ%"),fun_europ(col('Name')))
               .otherwise(df1.Name)
              ).show()
+--------------+---------+
|          Name|  replace|
+--------------+---------+
| Asia201909284|201909284|
|    US20190928| 20190928|
|Europ201909287|201909287|
|          null|     null|
|     something|something|
|       nothing|  nothing|
+--------------+---------+
...