我现有的数据格式如下:
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我想从现有的dataframe中创建一个dataframe,这样“ID”将成为列名,“Values”将成为各列的数据,如下所示:
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中找到可行的解决方案。我们很感激你的帮助。提前谢谢。
发布于 2017-08-30 03:36:35
您可以简单地将groupBy()与piviot()一起使用。使用您的示例dataframe:
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()方法。平均值是agg(avg($"Value"))。
希望能帮上忙!
https://stackoverflow.com/questions/45950979
复制相似问题