根据其他列中满足的条件添加一列

时间:2019-05-04 05:33:09

标签: python pyspark

我是PySpark的新手,目前正面临以下问题的挑战。 我的火花df如下

DeviceID     max(A)    max(B)    max(INUT)
0023002      2.5       3.7       8.1
0023045      2.2       1.3       11.3
0023008      4.7       2.3       1.9

我想如何添加另一列作为“状态”,其中值将基于以下逻辑。

if 0.20 * max(INUT) > max(max(A),max(B)) then Status = 'Imbalance' else 'Balance'

预计以上逻辑将产生以下数据帧。

DeviceID     max(A)    max(B)    max(INUT)    Status
0023002      2.5       3.7       8.1          'Balance'
0023045      2.2       1.3      11.3          'ImBalance'
0023008      4.7       2.3       1.9          'Balance'

现在要实现以上df,以下是我正在使用的代码

from pyspark.sql.function import col
import pyspark.sql.function as F
df_final = df.withColumn(
             'Status',
             F.when(col('max(INUT)')*0.20 > F.greatest(col('max(A)'),col('max(B)'),
             'Imbalance')\
         .otherwise('Balance')

上面的代码片段抛出错误

AttributeError: 'tuple' object has no attribute 'otherwise'

我在哪里错过了?任何提示将不胜感激。

1 个答案:

答案 0 :(得分:1)

这里有一些小语法错误,这是您的最终代码:

import pyspark.sql.functions as F

df = spark.createDataFrame(
[("0023002", 2.5, 3.7, 8.1),
("0023045", 2.2, 1.3, 11.3),
("0023008", 4.7, 2.3, 1.9)], ["DeviceID", "max_A", "max_B", "max_INUT"])

df_final = df.withColumn('Status', \
             F.when(F.col('max_INUT')*0.20 > F.greatest(F.col('max_A'),F.col('max_B')), 'Imbalance') \
         .otherwise('Balance'))

以及一些评论/备注:

  1. 要使用pyspark.sql.functions中的功能,只需使用F别名。您不需要将其导入两次。
  2. 缺少一些括号
  3. 我还替换了max(A) -> max_A,因为它使我相信阅读起来更容易

输出:

+--------+-----+-----+--------+---------+
|DeviceID|max_A|max_B|max_INUT|   Status|
+--------+-----+-----+--------+---------+
| 0023002|  2.5|  3.7|     8.1|  Balance|
| 0023045|  2.2|  1.3|    11.3|Imbalance|
| 0023008|  4.7|  2.3|     1.9|  Balance|
+--------+-----+-----+--------+---------+