2016-08-19 60 views
0

我有數據的數據幀如下如何使用Scala的

Key Today MTD QTD HTD YTD 
K1 10  20 10 20 50 
K2 20  30 20 10 60 

我期待像

Key PRD  Amt 
K1 Today 10 
K1 MTD  20 
K1 QTD  10 
K1 HTD  20 
K1 YTD  50 

輸出我試着用透視,但它的工作打破星火數據幀每一行成多行換一種方式。我不確定我是否可以使用平面地圖或地圖?請指教。

+0

將coulmn轉換爲行沒有任何意義。一般來說,對於像strucutre這樣的任何表,我們稱垂直序列爲列,水平序列爲行。但是,如果我們查看沒有表格上下文的列或行,那麼兩者都只是序列。 –

+0

另外我不認爲任何人都可以通過查看它的當前狀態來理解你的問題。我會嘗試從我對你的問題的理解中重新格式化它。 –

+0

@SarveshKumarSingh我乞求不同。 R中存在「melt.data.frame」函數是有原因的 - 我一直都在使用它。 – Paul

回答

1
import org.apache.spark.sql._ 
import spark.implicits._ 

val list = List(("K1", 10, 20, 10, 20,50), ("K2", 20, 30, 20, 10, 60)) 
val yourDF = sc.parallelize(list).toDF("Key", "Today", "MTD", "QTD", "HTD", "YTD") 

// yourDF.show() 
// +---+-----+---+---+---+---+ 
// |Key|Today|MTD|QTD|HTD|YTD| 
// +---+-----+---+---+---+---+ 
// | K1| 10| 20| 10| 20| 50| 
// | K2| 20| 30| 20| 10| 60| 
// +---+-----+---+---+---+---+ 

val newDataFrame = yourDF 
    .rdd 
    .flatMap(row => { 
    val key = row.getString(0) 
    val todayAmt = row.getInt(1) 
    val mtdAmt = row.getInt(2) 
    val qtdAmt = row.getInt(3) 
    val htdAmt = row.getInt(4) 
    val ytdAmt = row.getInt(5) 

    List(
     (key, "today", todayAmt), 
     (key, "MTD", mtdAmt), 
     (key, "QTD", qtdAmt), 
     (key, "HTD", htdAmt), 
     (key, "YTD", ytdAmt) 
    ) 
    }) 
    .toDF("Key", "PRD", "Amt") 

// newDataFrame.show() 
// +---+-----+---+ 
// |Key| PRD|Amt| 
// +---+-----+---+ 
// | K1|today| 10| 
// | K1| MTD| 20| 
// | K1| QTD| 10| 
// | K1| HTD| 20| 
// | K1| YTD| 50| 
// | K2|today| 20| 
// | K2| MTD| 30| 
// | K2| QTD| 20| 
// | K2| HTD| 10| 
// | K2| YTD| 60| 
// +---+-----+---+ 
+0

感謝這有助於:) – Sagar

+0

當我在我的流數據幀上運行此代碼時,我得到'java.lang.ClassNotFoundException:scala.Any'。任何想法爲什麼? – Paul