首页 > 解决方案 > 在 WHEN 和 OTHERWISE 条件语句 pyspark 中获取 TypeError

问题描述

我无法克服这个:

用下面的代码我得到

TypeError: when() missing 1 required positional argument: 'value'

windowval=(Window.partitionBy('Location').orderBy('month_in_timestamp')
               .rangeBetween(Window.unboundedPreceding, 0))

df1 = df.withColumn('NEW_COL', F.when(col('col1'). \
                                     isin('data1', \
                                          'data2', \
                                          'data3', \
                                          'data4',F.sum('col2').over(windowval))) \
                                          ,F.when(col('col1'). \
                                     isin('data5', \
                                          'data6', \
                                          'data7', F.avg('col2').over(windowval))))

我也试过了,我得到了

java.lang.IllegalArgumentException: otherwise() can only be applied on a Column previously generated by when()

df_actual_ytd = df_tgt_reach.withColumn('NEW_COL', F.when(col('col1'). \
                                     isin('data1', \
                                          'data2', \
                                          'data3', \
                                          'data4',F.sum('col2').over(windowval))) \
                                          .otherwise(F.avg('col2').over(windowval)))

标签: pythonapache-sparkpyspark

解决方案


我试图修改你的缩进以理解你的when条款,添加一些看起来有必要的更正。我无法测试更新的代码,因为我没有上下文:

df1 = df \
    .withColumn('NEW_COL',
                F.when(F.col('col1').isin('data1', 'data2', 'data3', 'data4', F.sum('col2').over(windowval)),
                        F.when(F.col('col1').isin('data5', 'data6', 'data7'), F.avg('col2').over(windowval))
                        )
                )

when()如果您的第一个条件匹配,我不确定您是否想要一个新条款,但无论如何,when()如果满足要求,第二个没有价值。根据另一个主题,这是另一种选择:

df1 = df \
    .withColumn('NEW_COL',
                F.when(F.col('col1').isin('data1', 'data2', 'data3', 'data4'), F.sum('col2').over(windowval))
                .when(F.col('col1').isin('data5', 'data6', 'data7'), F.avg('col2').over(windowval))
                )

如果这是您想要的,您也可以.otherwise()在某一时刻添加一个语句。


推荐阅读