python - 将 PySpark DataFrame 列中的负值替换为零的最有效方法是什么?

标签 python apache-spark-sql pyspark

我的目标是将 PySpark.DataFrame 列中的所有负元素替换为零。

输入数据

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

所需的输出数据

+------+
| 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 存在优化问题,因此这绝对不是正确的方法。但我不知道如何比较其他两种情况。一个答案绝对应该是进行实验并比较平均运行时间等等。但我想从理论上比较这些方法(和新方法)。

提前致谢...

最佳答案

您可以简单地创建一个列,在其中输入 if x > 0: x else 0 。这将是最好的方法。

这个问题理论上已经得到解决:Spark functions vs UDF performance?

import pyspark.sql.functions as F

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

您可以覆盖col1在原始数据框中,如果将其传递给 withColumn()

关于python - 将 PySpark DataFrame 列中的负值替换为零的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58713478/

相关文章:

python - Pyspark 加盐 : replace null in column with random negative values

python-从数据框中获取列数据类型

apache-spark - 为什么Spark认为这是交叉/笛卡尔式联接

python - 我正在编写代码来获取用户输入并在 python 中提供其文档。但是用户输入中的字符串在python中是用引号引起来的

python - PySpark:将 RDD 转换为数据框中的列

Python组合生成

java - 如何在现有的 Web 应用程序中使用 apache spark

python - 获取 Spark RDD 中每个键的最大值

python - pyspark 将 twitter json 流式传输到 DF

python - 将 Django 模型对象转换为 dict 并且所有字段都完好无损