Как наиболее эффективно заменить отрицательные значения в столбце PySpark DataFrame нулями? - PullRequest
1 голос
/ 05 ноября 2019

Моя цель - заменить все отрицательные элементы в столбце PySpark.DataFrame на ноль.

входные данные

+------+
| col1 |
+------+
|  -2  |
|   1  |
|   3  |
|   0  |
|   2  |
|  -7  |
|  -14 |
|   3  |
+------+

желаемый выводdata

+------+
| col1 |
+------+
|   0  |
|   1  |
|   3  |
|   0  |
|   2  |
|   0  |
|   0  |
|   3  |
+------+

В основном я могу сделать это, как показано ниже:

df = df.withColumn('col1', F.when(F.col('col1') < 0, 0).otherwise(F.col('col1'))

или udf можно определить как

import pyspark.sql.functions as F
smooth = F.udf(lambda x: x if x > 0 else 0, IntegerType())
df = df.withColumn('col1', smooth(F.col('col1')))

или

df = df.withColumn('col1', (F.col('col1') + F.abs('col1')) / 2)

или

df = df.withColumn('col1', F.greatest(F.col('col1'), F.lit(0))

Мой вопрос: какой из них наиболее эффективный? У Udf есть проблемы с оптимизацией, так что это абсолютно неправильный способ сделать это. Но я не знаю, как подходить к сравнению двух других случаев. Одним из ответов должно быть абсолютно проведение экспериментов и сравнение среднего времени работы и так далее. Но я хочу сравнить эти подходы (и новые подходы) теоретически.

Заранее спасибо ...

1 Ответ

0 голосов
/ 05 ноября 2019

Вы можете просто сделать столбец, где вы говорите, if x > 0: x else 0. Это был бы наилучший подход.

Вопрос уже был рассмотрен теоретически: Функции Spark и производительность UDF?

import pyspark.sql.functions as F

df = df.withColumn("only_positive", F.when(F.col("col1") > 0, F.col("col1")).otherwise(0))

Вы можете перезаписать col1 висходный фрейм данных, если вы передадите его withColumn()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...