Преобразовать столбец структуры в список Scala - PullRequest
0 голосов
/ 26 июня 2018

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

case class Class1(x1: Integer, x2: Double)

val df = Seq(("a", Class1(10,5.5)), ("b", Class1(7,2.1))).toDF("id", "col1")

Когда я пытаюсь преобразовать столбец структуры в RDD и собрать его:

df.select($"col1").rdd.map(x => x.asInstanceOf[Array[(Integer, Double)]]).collect()

Я получаю эту ошибку:

Caused by: java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to [Lscala.Tuple2;

Я хочу вернуть

List((10,5.5),(7,2.1))

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Поскольку у вас уже есть case class, вы можете воспользоваться этим при сборе данных. Просто конвертируйте DataFrame в DataSet[Class1] перед использованием collect. Это даст вам список, который вы хотите:

df.select($"col1").as[Class1].collect().toList
0 голосов
/ 26 июня 2018

Вы должны использовать нотацию ., чтобы выбрать столбец struct для разделения столбцов, и использовать имена столбцов, чтобы превратить его в tuple в map функции rdd, и вы получите желаемый результат.

df.select($"col1.*").rdd.map(x=> (x.getAs[Integer]("x1"), x.getAs[Double]("x2"))).collect.toList
//List((10,5.5), (7,2.1))

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

...