Scala 如何从给定列的值派生新列?

Scala 如何从给定列的值派生新列?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,给定如下所示的数据帧: foo bar baz a 4 x b 3 x c 5 y b 5 y a 7 z 我想得到这个: bar_a bar_b bar_c baz 4 null null x null 3 null x null null 5

给定如下所示的数据帧:

foo    bar    baz
  a      4      x
  b      3      x
  c      5      y
  b      5      y
  a      7      z
我想得到这个:

bar_a    bar_b    bar_c    baz
    4     null     null      x
 null        3     null      x
 null     null        5      y
 null        5     null      y
    7     null     null      z

是否有一些内置的功能来激发实现这一点?

你可以做一个
透视

val df2 = df.groupBy($"baz", monotonically_increasing_id().as("id"))
            .pivot("foo")
            .agg(first($"bar"))
            .drop("id")

df2.show
+---+----+----+----+
|baz|   a|   b|   c|
+---+----+----+----+
|  y|null|null|   5|
|  y|null|   5|null|
|  x|   4|null|null|
|  x|null|   3|null|
|  z|   7|null|null|
+---+----+----+----+
如果您想要漂亮的列名:

val df3 = df2.toDF(df2.columns.map(c => if (df2.columns.drop(1).contains(c)) "bar_" + c else c):_*)

df3.show
+---+-----+-----+-----+
|baz|bar_a|bar_b|bar_c|
+---+-----+-----+-----+
|  y| null| null|    5|
|  y| null|    5| null|
|  x|    4| null| null|
|  x| null|    3| null|
|  z|    7| null| null|
+---+-----+-----+-----+

很好,谢谢!我忘了提到我还有一列(
baz
),需要保留。我据此编辑了我的问题。这样行吗?否则,我可以恢复编辑,接受您的答案,并打开一个新问题。@TobiasHermann编辑!看看那是不是救命恩人,当然!在
groupBy
中完全使用
baz
是有意义的。谢谢!