Как преобразовать DataFrame в набор данных [CaseClass]? - PullRequest
0 голосов
/ 14 декабря 2018

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

import org.apache.spark.sql.{Dataset, Encoder, Encoders}

case class MyCase(sId: Int, tId:Int, label:Double, sAuthors:String, sYear:Int, sJournal:String,tAuthors:String, tYear:Int,tJournal:String, yearDiff:Int,nCommonAuthors:Int,isSelfCitation:Boolean
                  ,isSameJournal:Boolean,cosSimTFIDF:Double,sInDegrees:Int,sNeighbors:Array[Long],tInDegrees:Int,tNeighbors:Array[Long],inDegreesDiff:Int,commonNeighbors:Int,jaccardCoefficient:Double)

val men = Encoders[MyCase]

val ds: Dataset[MyCase] = transformedTrainingSetDF.as(men)

Пытаясь это сделать, я получаю следующую ошибку:

Ошибка: (208, 23) кодировщики объектов не принимают параметры типа.

val men = кодировщики [MyCase] ​​

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Хорошо, я думаю, что нашел причину, по которой я получил ошибку.Я должен был написать

case class MyCase(sId: Int, tId:Int, label:Double, sAuthors:String, sYear:Int, 
sJournal:String,tAuthors:String, tYear:Int,tJournal:String, 
yearDiff:Int,nCommonAuthors:Int,isSelfCitation:Boolean,                         
isSameJournal:Boolean,cosSimTFIDF:Double,sInDegrees:Int,sNeighbors:Array[Long],tInDegrees:Int,tNeighbors:Array[Long],inDegreesDiff:Int,commonNeighbors:Int,jaccardCoefficient:Double)     

До

object Test {
  def main(args: Array[String]): Unit = {    
0 голосов
/ 14 декабря 2018

Вам не нужен явный кодировщик для преобразования DataFrame (= набор данных Row s) в набор данных MyCase.Итак, самый простой способ решить проблему с val men = Encoders[MyCase] - это просто удалить ее.

Это действительно должно быть следующим образом, но это совсем не нужно.

import org.apache.spark.sql.Encoders
Encoders.product[Person]

С этимотложить в сторону, исправить as часть.Он должен использовать as, который принимает тип, а не объект (они различаются по своему назначению).

val ds: Dataset[MyCase] = transformedTrainingSetDF.as[Person]

И все готово.

0 голосов
/ 14 декабря 2018

Вы должны использовать метод Encoders.product для классов дел согласно Encoders документации:

Кодировщик для типа продукта Scala (кортежи, классы дел и т. Д.).

Попробуйте изменить его следующим образом:

val men = Encoders.product[MyCase]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...