2016-04-22 15 views
6

Ho una stringa annidata come mostrato di seguito. Voglio piatta mappare loro di produrre righe uniche in SparkCome mappare un Dataframe nidificato in Spark

mio dataframe ha

A,B,"x,y,z",D 

voglio convertire di produrre output come

A,B,x,D 
A,B,y,D 
A,B,z,D 

Come posso farlo.

Fondamentalmente come posso fare piatto mappa e applicare qualsiasi funzione all'interno della dataframe

Grazie

risposta

14

Spark 2.0+

Dataset.flatMap:

val ds = df.as[(String, String, String, String)] 
ds.flatMap { 
    case (x1, x2, x3, x4) => x3.split(",").map((x1, x2, _, x4)) 
}.toDF 

Spark 1.3+ .

Usa split e explodefunctions:

val df = Seq(("A", "B", "x,y,z", "D")).toDF("x1", "x2", "x3", "x4") 
df.withColumn("x3", explode(split($"x3", ","))) 

Spark 1.x

DataFrame.explode (deprecato in Spark 2.x)

df.explode($"x3")(_.getAs[String](0).split(",").map(Tuple1(_))) 
+0

Devo ricordare il Dataset' opzione ' - Grazie per averlo aggiunto. –

+0

@DavidGriffin Grazie. Avrei dovuto chiuderlo come duplicato, ma ho contrassegnato per errore una domanda sbagliata, quindi ho deciso di rispondere e aggiungere qualcosa di nuovo :) – zero323

+0

@ zero323 Ho controllato la scala api docs per "esplodere" in 'funzioni' e non viene mostrato come deprecato. https://spark.apache.org/docs/2.1.0/api/scala/index.html#org.apache.spark.sql.functions$ – elghoto

Problemi correlati