2016-08-19 3 views
0

Ich habe einen Datenrahmen Daten wie unten, wie die einzelnen Zeilen in mehrere Zeilen in Spark-Datenrahmen brechen scala mit

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

wie ich bin auf der Suche Ausgang

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

Ich habe versucht, mit Pivot arbeiten, aber es gibt anderen Weg. Ich bin mir nicht sicher, ob ich eine flache Karte oder Karte verwenden kann. Bitte beraten.

+0

Umwandlung eines Coulmn in Zeile macht keinen Sinn. Im Allgemeinen bezeichnen wir für jede tabellenartige Struktur eine vertikale Sequenz als Spalte und eine horizontale Sequenz als Zeile. Aber wenn wir eine Spalte oder Zeile ohne den Kontext einer Tabelle betrachten, dann sind beide nur Sequenzen. –

+0

Auch glaube ich nicht, dass jemand deine Frage verstehen kann, indem er seinen aktuellen Zustand betrachtet. Ich werde versuchen, es von meinem Verständnis Ihrer Frage neu zu formatieren. –

+0

@SarveshKumarSingh Ich bitte um nicht zu unterscheiden. Es gibt einen Grund, warum die Funktion "melt.data.frame" in R existiert - ich benutze sie die ganze Zeit. – Paul

Antwort

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

Danke, das hilft :) – Sagar

+0

Wenn ich diesen Code auf meinem Streaming-Datenframe ausführen, bekomme ich 'java.lang.ClassNotFoundException: scala.Any'. Irgendeine Idee warum? – Paul

Verwandte Themen