首页 > 解决方案 > pyspark when else 语句返回不正确的输出

问题描述

我在下面粘贴了我的代码。我期待什么时候col2 = 7,它应该返回1,但它有时会返回 1 ,有时会返回 2 - 在其他时候。col2一旦设置好,我就不做任何操作了。有没有人经历过这种奇怪的行为?还是由于每个条件的限制重叠而导致的问题?

 df = df.withColumn('col1', F.when(F.col('col2').between(1,7), 1)
                             .when(F.col('col2').between(7,14), 2)
                             .when(F.col('col2').between(14,21), 3)
                             .when(F.col('col2').between(21,28), 4)
                             .otherwise(5))

标签: apache-sparkpysparkapache-spark-sqlcase

解决方案


第一点: between 是包容性的,并且您的区间中有一些重叠(7 在第一个和第二个区间中都可以是 True,因为它们都包含 7)

所以这应该改进:

 df = df.withColumn('col1', F.when(F.col('col2').between(1,7), 1)
                             .when(F.col('col2').between(8,14), 2)
                             .when(F.col('col2').between(15,21), 3)
                             .when(F.col('col2').between(22,28), 4)
                             .otherwise(5))

但是,当使用多个时,F.when()我可以通过将它们嵌套在.otherwise(F.when())如下所示的内部来减少麻烦:

 df = df.withColumn('col1', F.when(F.col('col2').between(1,7), 1)
                             .otherwise(F.when(F.col('col2').between(8,14), 2)
                             .otherwise(F.when(F.col('col2').between(15,21), 3)
                             .otherwise(F.when(F.col('col2').between(22,28), 4)
                             .otherwise(5)))))

推荐阅读