【问题标题】:Swap multiple value columns of dataframe in spark在火花中交换数据框的多个值列
【发布时间】:2019-06-17 07:00:44
【问题描述】:

我需要根据其中一个列的条件交换多个列的值,并使用 API 而不是 sparkQL

我有一个包含 [A,B,C,X,Y,Z] 列的 DataFrame,它的行具有这种模式:

(1,2,3,null,null,null),
(3,3,3,null,null,null),
(null,null,null,5,3,2),
(3,1,1,null,null,null),
(null,null,null,3,4,1)

当任何行的条件是 A 列中的值为空时,我想实现在列组 (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 结果 = df.withColumn("A", when(col("A").isNull, col("X")).withColumn("X", when(col("A").isNull,点亮(空))

我得到了使用该行“(5,null,null,null,3,2)”定义的列交换的预期结果。但是当我为其他 2 列添加操作“withColumn”时,我最终得到了像这样的行“(5,null,null,null,3,2)”

任何帮助将不胜感激。

【问题讨论】:

    标签: scala apache-spark-sql


    【解决方案1】:

    交换“A”和“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)).
    

    【讨论】:

    • 当然我很困惑为什么它只适用于第一列,因为我没有意识到如果 when 子句不匹配,函数“withColumn”默认会设置一个空值(在事实上我认为它会保持列值不变)。 Tahanks 因为它是这样工作的。我想如果不添加新列就没有办法解决这个问题。
    猜你喜欢
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2017-02-15
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多