根据另一列的值动态选择要更新的列

时间:2019-06-03 15:56:07

标签: scala apache-spark apache-spark-sql apache-spark-2.3

我的DataFrame看起来像这样:

val_1   val_2   seq 
ABC     DEF     1       
ABC     DEF     2                   
ABC     DEF     3                       
GHI     LMN     1
GHI     LMN     2

我想要的结果

val_1   val_2   cod_1   cod_2   cod_3
ABC     DEF     1       2       3
GHI     LMN     1       2

达到此结果的最佳方法是什么?

我创建了一个名为cod_num的列,其中num=max(seq)。 我的想法是创建一个像下面这样的DataFrame,然后在val_1val_2上进行分组。

val_1   val_2   seq     cod_1   cod_2   cod_3
ABC     DEF     1       1
ABC     DEF     2               2   
ABC     DEF     3                       3
GHI     LMN     1       1
GHI     LMN     2               2

我试图通过这种方式将正确的列简单地传递给dataFrame.withColumn myDF.withColumn("cod_" + $"seq", $"seq")。 不会引发任何错误,但是如果我呼叫myDF.show myDF与以前一样。

1 个答案:

答案 0 :(得分:0)

您可以使用pivot

df.groupBy("val_1", "val_2")
  .pivot("seq")
  .agg(first("seq"))
  .show()
+-----+-----+---+---+----+
|val_1|val_2|  1|  2|   3|
+-----+-----+---+---+----+
|  ABC|  DEF|  1|  2|   3|
|  GHI|  LMN|  1|  2|null|
+-----+-----+---+---+----+

如果要将列重命名为例如cod_1,它可以像this

一样完成

注意:myDF.withColumn("cod_" + $"seq", $"seq")不能工作,因为第一个参数是字符串,而不是列,因此将其扩展为

"cod_" + new ColumnName("seq").toString

总是产生cod_seq