2017-01-03 2 views
0

мой DataFrame так:Как получить данные первой строки каждого списка?

+------------------------+----------------------------------------+ 
|ID      |probability        | 
+------------------------+----------------------------------------+ 
|583190715ccb64f503a|[0.49128147201958017,0.5087185279804199]| 
|58326da75fc764ad200|[0.42143416087939345,0.5785658391206066]| 
|583270ff17c76455610|[0.3949217100212508,0.6050782899787492] | 
|583287c97ec7641b2d4|[0.4965059792664432,0.5034940207335569] | 
|5832d7e279c764f52e4|[0.49128147201958017,0.5087185279804199]| 
|5832e5023ec76406760|[0.4775830044196701,0.52241699558033] | 
|5832f88859cb64960ea|[0.4360509428173421,0.563949057182658] | 
|58332e6238c7643e6a7|[0.48730029128352853,0.5126997087164714]| 

и я получаю столбец вероятности, используя

val proVal = Data.select("probability").rdd.map(r => r(0)).collect() 
proVal.foreach(println) 

результат является:

[0.49128147201958017,0.5087185279804199] 
[0.42143416087939345,0.5785658391206066] 
[0.3949217100212508,0.6050782899787492] 
[0.4965059792664432,0.5034940207335569] 
[0.49128147201958017,0.5087185279804199] 
[0.4775830044196701,0.52241699558033] 
[0.4360509428173421,0.563949057182658] 
[0.48730029128352853,0.5126997087164714] 

, но я хочу, чтобы получить первый столбец данных для каждого ряда, например:

0.49128147201958017 
0.42143416087939345 
0.3949217100212508 
0.4965059792664432 
0.49128147201958017 
0.4775830044196701 
0.4360509428173421 
0.48730029128352853 

как это можно сделать?

Входа является стандартным вводом случайного леса, над входной val Data = predictions.select("docID", "probability")

predictions.printSchema() 

root |-- docID: string (nullable = true) |-- label: double (nullable = false) |-- features: vector (nullable = true) |-- indexedLabel: double (nullable = true) |-- rawPrediction: vector (nullable = true) |-- probability: vector (nullable = true) |-- prediction: double (nullable = true) |-- predictedLabel: string (nullable = true)

, и я хочу, чтобы получить первое значение «вероятности» колонок

ответ

2

Вы можете использовать Column.apply метод для получения n-го элемента в столбце массива - в этом случае первый столбец (с использованием индекса 0):

import sqlContext.implicits._ 
val proVal = Data.select($"probability"(0)).rdd.map(r => r(0)).collect() 

Кстати, если вы используете Спарк 1.6 или выше, вы можете также использовать Dataset API для более чистого способа преобразования dataframe в парном разряде:

val proVal = Data.select($"probability"(0)).as[Double].collect() 
+0

Спасибо, я использую метод, но оба метода бросить такая же ошибка: Исключение в потоке «main» org.apache.spark.sql.AnalysisException: не удается извлечь значение из вероятности № 177; но строка 177 имеет ту же структуру, что и другие строки. – John

+0

Если вы можете предоставить образец ввода, для которого это не удается - я смогу попытаться помочь, иначе я не вижу никакой очевидной причины для этого. Также - можете ли вы отредактировать вопрос и добавить результат 'Data.printSchema()'? –

+0

вход представляет собой стандартный случайный вход в лес, конечный результат - это первое значение столбца «вероятность», результат Data.printSchema(): корень | - docID: string (nullable = true) | - label: double (nullable = false) | - особенности: vector (nullable = true) | - indexedLabel: double (nullable = true) | - rawPrediction: vector (nullable = true) | - вероятность: vector (nullable = true) | - предсказание: double (nullable = true) | - expectededLabel: string (nullable = true) – John