2017-08-30 67 views
0

我有現成的數據幀爲:從現有數據框中看到Spark數據幀,使得基於現有的數據幀行新的數據幀中的列

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 

我想從現有數據幀,使得「標識」將成爲列一個數據幀名稱和「價值」將成爲相應列的數據爲:

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中。幫助表示讚賞。提前致謝。

回答

1

您可以簡單地使用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()方法。例如。平均值爲agg(avg($"Value"))

希望它有幫助!

相關問題