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
是有意义的。谢谢!