Scala 如何将DataFrame转换为Dataset[CaseClass]?

Scala 如何将DataFrame转换为Dataset[CaseClass]?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我在尝试将数据帧转换为数据集时遇到了一个问题,这样我就可以运行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:In

我在尝试将数据帧转换为数据集时遇到了一个问题,这样我就可以运行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]


您应该根据
编码器
文档使用
编码器。产品
方法用于案例类:

Scala产品类型(元组、case类等)的编码器

尝试按以下方式更改它:

val men = Encoders.product[MyCase]

好的,我想我找到了出错的原因。我应该写信的

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 = {    

将数据帧(
Row
s的数据集)转换为
MyCase
的数据集不需要显式编码器。因此,使用
val men=Encoders[MyCase]
解决问题的最简单方法就是删除它


让我们假设以下案例类
Person

case class Person(id: Long, name: String)
应该是这样的,但根本不需要

import org.apache.spark.sql.Encoders
Encoders.product[Person]
将其放在一边,将
修复为
部分。它应该使用
作为
,采用类型而不是对象(它们的用途不同)


您已经完成了。

在哪里定义案例类?您是否在spark shell
中输入行,或者这些行是spark应用程序的一部分?您使用的spark版本是什么?这是您的Spark应用程序中唯一的更改还是其他建议的更改(包括我的更改)也需要?在使用.product之后,正如@JacekLaskowski所说,我将代码移到object上面,
Person
来自何处?@matanster这只是一个示例案例类。将其添加到答案中。
val ds: Dataset[MyCase] = transformedTrainingSetDF.as[Person]