当前位置: 首页 > 知识库问答 >
问题:

在spark中交换dataframe的多个值列

齐才艺
2023-03-14

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

我有一个包含列 [A,B,C,X,Y,Z] 的数据帧,并且它具有具有以下模式的行:

(1,2,3,空,空,空),< br> (3,3,3,空,空,空),< br >(空,空,空,5,3,2),< br> (3,1,1,空,空),< br >(空,空,空,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 result = df.withColumn("A ",when(col("A ")。isNull,col("X "))。withColumn("X ",when(col("A ")。isNull,lit(null))

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

任何帮助都将不胜感激。

共有1个答案

南门祯
2023-03-14

交换“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)).
 类似资料:
  • 我试图替换或更新dataframe中的某些特定列值,因为我们知道dataframe是不可变的,我试图转换到新的dataframe而不是更新或替换。 错误:重载方法值数组 非常感谢您的帮助!!

  • 如何将一个数据帧中的多列(比如3列)组合成一个列(在一个新的数据帧中),其中每一行都成为一个Spark DenseVector?类似于这个线程,但在Java中,有一些下面提到的调整。 我试着用这样的UDF: 然后注册UDF: 其中<code>数据类型<code>为: 当我在一个有3列的数据帧上调用这个UDF并打印出新数据帧的模式时,我得到如下结果: 这里的问题是,我需要一个向量在外部,而不是在结构

  • 我在尝试用空值替换Spark数据帧特定列的值时遇到了一个问题。我有一个超过50列的数据框架,其中两列是关键列。我想用相同的模式创建一个新的数据框,新的数据框应该具有来自键列的值,而非键列中的值应该为null。我尝试了以下方法,但遇到了问题: 当我在中只有字符串类型列时,这种方法很好。但是我有一些双类型和int类型的列,这是抛出错误的,因为rdd是一个空字符串列表。 为了避免这种情况,我尝试将作为空

  • 问题内容: 我有一个非常大的数据集,想用数字替换字符串。我想对数据集进行操作,而无需为数据集中的每个键(列)键入映射函数。(类似于fillna方法,但用关联值替换特定的字符串)。反正有这样做吗? 这是我的数据集的一个例子 预期结果: 非常差= 1,差= 2,差= 3,好= 4,非常好= 5 //乔纳斯 问题答案: 使用替换

  • 所以我有一个有3列的spark dataframe。 我怎么能做到这一点,有人能解释一下吗? spark:1.6.2Scala:2.10