Моя цель - заменить все отрицательные элементы в столбце 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 есть проблемы с оптимизацией, так что это абсолютно неправильный способ сделать это. Но я не знаю, как подходить к сравнению двух других случаев. Одним из ответов должно быть абсолютно проведение экспериментов и сравнение среднего времени работы и так далее. Но я хочу сравнить эти подходы (и новые подходы) теоретически.
Заранее спасибо ...