unpivot in spark-sql / pyspark

Ho un problema a portata di mano in cui voglio unpivot tabella in spark-sql / pyspark. Ho esaminato la documentazione e ho potuto vedere che c’è solo supporto per pivot ma nessun supporto per non-pivot finora. C’è un modo per ottenerlo?

Lascia che il mio tavolo iniziale assomigli a questo

Lascia che il mio tavolo iniziale assomigli a questo

quando faccio ruotare questo in pyspark usando il comando sotto menzionato

df.groupBy("A").pivot("B").sum("C") 

Ho capito questo come risultato

Dopo la tabella pivot appare così

Ora voglio annullare la rotazione della tabella pivot. In generale questa operazione può / non può fornire la tabella originale in base a come ho ruotato la tabella originale.

Spark-sql a partire da ora non fornisce il supporto della scatola per unpivot. C’è un modo per ottenerlo?

Grazie Manish

Puoi usare la funzione integrata nello stack, ad esempio in Scala:

 scala> val df = Seq(("G",Some(4),2,None),("H",None,4,Some(5))).toDF("A","X","Y", "Z") df: org.apache.spark.sql.DataFrame = [A: string, X: int ... 2 more fields] scala> df.show +---+----+---+----+ | A| X| Y| Z| +---+----+---+----+ | G| 4| 2|null| | H|null| 4| 5| +---+----+---+----+ scala> df.select($"A", expr("stack(3, 'X', X, 'Y', Y, 'Z', Z) as (B, C)")).where("C is not null").show +---+---+---+ | A| B| C| +---+---+---+ | G| X| 4| | G| Y| 2| | H| Y| 4| | H| Z| 5| +---+---+---+ 

O in pyspark:

 In [1]: df = spark.createDataFrame([("G",4,2,None),("H",None,4,5)],list("AXYZ")) In [2]: df.show() +---+----+---+----+ | A| X| Y| Z| +---+----+---+----+ | G| 4| 2|null| | H|null| 4| 5| +---+----+---+----+ In [3]: df.selectExpr("A", "stack(3, 'X', X, 'Y', Y, 'Z', Z) as (B, C)").where("C is not null").show() +---+---+---+ | A| B| C| +---+---+---+ | G| X| 4| | G| Y| 2| | H| Y| 4| | H| Z| 5| +---+---+---+