Scala DataFrame доступ к элементу WrappedArray в массиве - PullRequest
0 голосов
/ 11 мая 2018

Я новичок в scala и несколько часов бьюсь над итерацией этого массива WrappedArray в массиве и выводом каждого элемента

  scala> collected
    res73: Array[org.apache.spark.sql.Row] = 
    Array([31511,WrappedArray([328,0.7845393], [1264,0.7568395], 
          [933,0.7005877], [78,0.67518044], [787,0.5766443], [806,0.5260384],
          [2505,0.48659027], [1625,0.48547864], [2443,0.47885978], [975,0.4683425],
          [888,0.42476034], [723,0.40946054], [1616,0.39374632], [2466,0.37899566],
          [950,0.37615034], [1336,0.36006662], [812,0.3509268], [1558,0.33291495], 
          [286,0.32301086], [758,0.3210116], [1397,0.3134273], [824,0.29997423], 
          [1698,0.29471087], [689,0.2890404], [10,0.27876395], [1146,0.27792412], 
          [1088,0.27623963], [1352,0.2704942], [710,0.26956537], [2065,0.2597088])])

Может кто-нибудь сообщить мне, как извлечь элемент из WrappedArray в массиве?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Как правило, вы получаете Array из Row Array[Row] после сбора

Согласно вашим данным ваша строка содержит два данных, первый как Int 31511, а второй как WrappedArray

Таким образом, вы можете получить WrappedArray в виде массива как

val data = collected.map(_.getList[(Double, Double)](1))

Это даст вам Array[(Double, Double)] теперь вы можете использовать в качестве массива

Чтобы получить только первый элемент, вам нужно сделать data.map(_._1)

Надеюсь, это поможет!

0 голосов
/ 11 мая 2018

Вы можете сделать одно из следующих действий (прокомментированных для ясности и для объяснений)

import org.apache.spark.sql.Row
//get the first elements of the WrappedArray in  Array[org.apache.spark.sql.Row] = Array([31511,WrappedArray([328,0.7845393], [1264,0.7568395]...
collected.map(row => row.getAs[collection.mutable.WrappedArray[Row]](1).map(struct => struct(0)))

//get the second elements of the WrappedArray in  Array[org.apache.spark.sql.Row] = Array([31511,WrappedArray([328,0.7845393], [1264,0.7568395]...
collected.map(row => row.getAs[collection.mutable.WrappedArray[Row]](1).map(struct => struct(1)))

//get the both elements of the WrappedArray in  Array[org.apache.spark.sql.Row] = Array([31511,WrappedArray([328,0.7845393], [1264,0.7568395]...
collected.map(row => row.getAs[collection.mutable.WrappedArray[Row]](1).map(struct => (struct(0), struct(1))))

//if you know the struct names and datatypes then 
//get the first element of the WrappedArray in  Array[org.apache.spark.sql.Row] = Array([31511,WrappedArray([328,0.7845393], [1264,0.7568395]...
collected.map(row => row.getAs[collection.mutable.WrappedArray[Row]](1).map(struct => (struct.getAs[Int]("_1"), struct.getAs[Double](1))))

Надеюсь, ответ полезен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...