Reshaping Data with Pivot in Spark bietet Unterstützung für die Umformung mit pivot
. Ich habe verstanden, melt
ist in etwa die Rückseite des Pivot auch unpivot
genannt. Ich bin relativ neu zu Spark
. Mit meinem Wissen habe ich versucht, den Schmelzbetrieb zu implementieren.
def melt(df: DataFrame, columns: List[String]): DataFrame ={
val restOfTheColumns = df.columns.filterNot(columns.contains(_))
val baseDF = df.select(columns.head, columns.tail: _*)
val newStructure =StructType(baseDF.schema.fields ++ List(StructField("variable", StringType, true), StructField("value", StringType, true)))
var newdf = sqlContext.createDataFrame(sqlContext.sparkContext.emptyRDD[Row], newStructure)
for(variableCol <- restOfTheColumns){
val colValues = df.select(variableCol).map(r=> r(0).toString)
val colRdd=baseDF.rdd.zip(colValues).map(tuple => Row.fromSeq(tuple._1.toSeq.:+(variableCol).:+(tuple._2.toString)))
var colDF =sqlContext.createDataFrame(colRdd, newStructure)
newdf =newdf.unionAll(colDF)
}
newdf
}
Es macht die Arbeit. Aber ich bin mir nicht sicher über die Effizienz.
+-----+---+---+----------+------+
| name|sex|age| street|weight|
+-----+---+---+----------+------+
|Alice| f| 34| somewhere| 70|
| Bob| m| 63| nowhere| -70|
|Alice| f|612|nextstreet| 23|
| Bob| m|612| moon| 8|
+-----+---+---+----------+------+
Kann
melt(df, List("name", "sex"))
Das Ergebnis ist, wie unten als
verwendet werden:
+-----+---+--------+----------+
| name|sex|variable| value|
+-----+---+--------+----------+
|Alice| f| age| 34|
| Bob| m| age| 63|
|Alice| f| age| 612|
| Bob| m| age| 612|
|Alice| f| street| somewhere|
| Bob| m| street| nowhere|
|Alice| f| street|nextstreet|
| Bob| m| street| moon|
|Alice| f| weight| 70|
| Bob| m| weight| -70|
|Alice| f| weight| 23|
| Bob| m| weight| 8|
+-----+---+--------+----------+
Ich hoffe, dass es nützlich ist, und schätzen Sie Ihre Kommentare, wenn Raum für Verbesserungen gibt.
Scheint nicht so. Wenn Sie Ihre Daten in den Speicher einpassen können, verwenden Sie 'as.data.frame()', um den Spark DataFrame in einen nativen data.frame zu konvertieren, umzuformen und in Spark zurückzuschreiben. – Thomas
Weil es keine gibt. Sie müssen es selbst schreiben. – eliasah