我是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'
我在哪里错过了?任何提示将不胜感激。
答案 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'))
以及一些评论/备注:
pyspark.sql.functions
中的功能,只需使用F别名。您不需要将其导入两次。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|
+--------+-----+-----+--------+---------+