2016-04-22 4 views
6

Mam zagnieżdżony ciąg jak pokazano poniżej. Chcę płaska mapa je do produkcji unikalnych wierszy SparkJak płasko zagnieżdżona ramka danych w Spark

Moja dataframe ma

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

Chcę przekształcić go produkować wyjście jak

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

W jaki sposób można to zrobić.

zasadzie jak mogę zrobić płaską mapę i zastosować dowolną funkcję wewnątrz Dataframe

Dzięki

Odpowiedz

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 + .

Zastosowanie split i 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 (przestarzałe w Spark 2.x)

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

Muszę zapamiętać opcję 'Dataset' - dzięki za dodanie. –

+0

@DavidGriffin Dzięki. Powinienem zamknąć to jako duplikat, ale przez pomyłkę oznaczyłem błędne pytanie, więc postanowiłem odpowiedzieć i dodać coś nowego :) – zero323

+0

@ zero323 Sprawdziłem scala api docs dla 'eksplodować' w' funkcji' i nie pokazuje się jako przestarzałe. https://spark.apache.org/docs/2.1.0/api/scala/index.html#org.apache.spark.sql.functions$ – elghoto