2016-06-28 8 views
1

I einen Datenrahmen myDf haben, die eine Reihe von Paaren von Punkten enthalten (dh x und y-Koordinaten), hat es das folgende Schema:Extract Spalten in verschachteltem Funkendatenrahmen als scala Arrays

myDf.printSchema 

root 
|-- pts: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- x: float (nullable = true) 
| | |-- y: float (nullable = true) 

Ich mag erhalten x und y als einzelne Ebene Scala Array 's. Ich denke, ich muss die Explode-Funktion anwenden, aber ich kann nicht herausfinden, wie. Ich habe versucht, this Lösung anzuwenden, aber ich kann es nicht zum Laufen bringen.

Ich bin mit Spark-1.6.1 mit Scala 2.10

EDIT: Ich weiß, dass ich ein Missverständnis hatte, wie Spark-Werke, die tatsächliche Arrays immer nur möglich, wenn die Daten (oder mit UDF) gesammelt

Antwort

0

Es gibt zwei Möglichkeiten, um die Punkte als Plan scala Arrays zu erhalten:

den Fahrer zu sammeln:

val localRows = myDf.take(10) 
val xs: Array[Float] = localRows.map(_.getAs[Float]("x")) 
val ys: Array[Float] = localRows.map(_.getAs[Float]("y")) 

oder innerhalb einer UDF:

val processArr = udf((pts:WrappedArray[Row]) => { 

    val xs: Array[Float] = pts.map(_.getAs[Float]("x")).array 
    val ys: Array[Float] = pts.map(_.getAs[Float]("y")).array 
    //...do something with it 
}) 

}

3

Unter der Annahme, myDf ist DataFrame Lesen aus einer Datei json:

{ 
"pts":[ 
    { 
    "x":0.0, 
    "y":0.1 
    }, 
    { 
    "x":1.0, 
    "y":1.1 
    }, 
    { 
    "x":2.0, 
    "y":2.1 
    } 
    ] 
} 

Sie können explode wie folgt tun:

Java:

DataFrame pts = myDf.select(org.apache.spark.sql.functions.explode(df.col("pts")).as("pts")) 
        .select("pts.x", "pts.y"); 
pts.printSchema(); 
pts.show(); 

Scala:

// Sorry I don't know Scala 
// I just interpreted from the above Java code 
// Code here may have some mistakes 
val pts = myDf.select(explode($"pts").as("pts")) 
       .select($"pts.x", $"pts.y") 
pts.printSchema() 
pts.show() 

Hier ist das gedruckte Schema:

root 
|-- x: double (nullable = true) 
|-- y: double (nullable = true) 

Und hier ist das Ergebnis pts.show():

+---+---+ 
| x| y| 
+---+---+ 
|0.0|0.1| 
|1.0|1.1| 
|2.0|2.1| 
+---+---+ 
+0

Danke an den Fragesteller und den Antworter. Ihr habt meinen Tag gemacht. Ich zog mir die Haare aus, als ich Spark-Xml benutzte und deine Lösung rockte ;-) –

+0

Ich bin froh das zu hören, thx Kumpel –

Verwandte Themen