我需要在其中一个列的条件下交换多个列的值,并使用API而不是sparkQL
我有一个列为[a,B,C,X,Y,Z]的DataFrame,它有如下模式的行:
当任何行具有列a中的值为null的条件时,我希望实现在列组(a,b,c)和(x,y,z)之间交换值。因此,在执行之后,表应该只在列[A,B,C]中有值。我试着做一些类似的事情
val result = df.withColumn("A", when(col("A").isNull, col("X")).withColumn("X", when(col("A").isNull,lit(null)).withColumn("B", when(col("A").isNull, col("Y")).withColumn("Y", when(col("A").isNull,lit(null)).withColumn("C", when(col("A").isNull, col("Z")).withColumn("Z", when(col("A").isNull,lit(null)).
令人惊讶的是,只执行这个:
val result=df.withColumn
我得到了我用那行"(5,null,null,null,3,2)"定义的列交换的预期结果。但是,当我为其他2列添加操作"withColumn"时,我得到的行是这样的"(5,null,null,null,3,2)">
如有任何帮助,我们将不胜感激。
交换"A"one_answers"X"后,"A"不再为空。因此,后续操作不起作用。
我强烈建议您使用标志栏来帮助实现这一点。
val result = df
.withColumn("flag", when(col("A").isNull, true).otherwise(false)
.withColumn("A", when(col("flag") === true, col("X"))
.withColumn("X", when(col("flag") === true, lit(null))
.withColumn("B", when(col("flag") === true, col("Y"))
.withColumn("Y", when(col("flag") === true, lit(null))
.withColumn("C", when(col("flag") === true, col("Z"))
.withColumn("Z", when(col("flag") === true, lit(null)).