Scala 从现有Dataframe创建Spark Dataframe,使新Dataframe的列基于现有Dataframe行

Scala 从现有Dataframe创建Spark Dataframe,使新Dataframe的列基于现有Dataframe行,scala,apache-spark,spark-dataframe,Scala,Apache Spark,Spark Dataframe,我将现有的数据帧设置为: Timestamp, ID, Value 29/08/2017 4:51:23, ID-1, 1.1 29/08/2017 4:52:14, ID-2, 2.1 29/08/2017 4:52:14, ID-3, 3.1 29/08/2017 4:55:23, ID-1, 1.2 29/08/2017 4:55:23, ID-3, 3.2 29/08/2017 4:57:42, ID-2, 2.2 我想从现有数据框创建一个数据框,这样“id”将成为

我将现有的数据帧设置为:

Timestamp,         ID,   Value
29/08/2017 4:51:23, ID-1, 1.1
29/08/2017 4:52:14, ID-2, 2.1
29/08/2017 4:52:14, ID-3, 3.1
29/08/2017 4:55:23, ID-1, 1.2
29/08/2017 4:55:23, ID-3, 3.2
29/08/2017 4:57:42, ID-2, 2.2
我想从现有数据框创建一个数据框,这样“id”将成为列名,“value”将成为相应列的数据,如下所示:

Timestamp,            ID-1,    ID-2,   ID-3
29/08/2017 4:51:23,    1.1,     null,   null
29/08/2017 4:52:14,    null,    2.1,    3.1
29/08/2017 4:55:23,    1.2,     null,   3.2
29/08/2017 4:57:42,    null,    2.2,    null
我无法在Scala中找到可行的解决方案。谢谢你的帮助。提前感谢。

您只需将groupBy与piviot一起使用即可。使用示例数据帧:

val spark = SparkSession.builder.getOrCreate()
import spark.implicits._

val df = ...

df.show()
+------------------+----+-----+
|         Timestamp|  ID|Value|
+------------------+----+-----+
|29/08/2017 4:51:23|ID-1|  1.1|
|29/08/2017 4:52:14|ID-2|  2.1|
|29/08/2017 4:52:14|ID-3|  3.1|
|29/08/2017 4:55:23|ID-1|  1.2|
|29/08/2017 4:55:23|ID-3|  3.2|
|29/08/2017 4:57:42|ID-2|  2.2|
+------------------+----+-----+

val newDF = df.groupBy("Timestamp")
  .pivot("ID")
  .agg(sum($"Value"))

newDF.show()
+------------------+----+----+----+
|         Timestamp|ID-1|ID-2|ID-3|
+------------------+----+----+----+
|29/08/2017 4:57:42|null| 2.2|null|
|29/08/2017 4:55:23| 1.2|null| 3.2|
|29/08/2017 4:51:23| 1.1|null|null|
|29/08/2017 4:52:14|null| 2.1| 3.1|
+------------------+----+----+----+
如果两行或更多行的时间戳和id相同,则将这些值相加。如果需要其他行为,只需更改agg方法。例如,平均值为aggavg$值

希望有帮助