2016-06-28 2 views
1

у меня есть DataFrame myDf, который содержит множество пар точек (т.е. координаты х и у), имеет следующую схему:Извлечение столбцов в гнездовой Спарк DataFrame как SCALA Массивы

myDf.printSchema 

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

Я хочу, чтобы получить x и y как отдельная равнина Скала Array. Я думаю, мне нужно применить функцию explode, но я не могу понять, как это сделать. Я попытался применить решение this, но я не могу заставить его работать.

Я использую Спарк 1.6.1 с Scala 2,10

EDIT: Я понимаю, что у меня было недопонимание, как искровые работы, получение фактических массивов возможно только, если собраны данные (или с помощью UDF)

ответ

0

Есть два способа, чтобы получить очки, как план SCALA Массивы:

собирающих водителю:

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

или внутри ОДС:

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

Предполагая myDf является DataFrame чтение из файла json:

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

Вы можете сделать explode так:

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() 

Вот печатное схема:

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

А вот pts.show() результат:

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

Спасибо и допрашивающему, и ответчику. Вы, ребята, сделали свой день. Я снимал с себя волосы при использовании искрового xml и вашего решения камней ;-) –

+0

Рад это слышать, thx dude –

Смежные вопросы