如何将DataFrame转换为数据集[CaseClass]



我在尝试将数据帧转换为数据集以便运行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]

您不需要显式编码器来将DataFrame(=Row的数据集(转换为MyCase的数据集。因此,修复val men = Encoders[MyCase]问题的最简单方法就是将其删除


让我们假设以下事例类Person:

case class Person(id: Long, name: String)

它确实应该如下,但根本不需要它。

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

放在一边,修复as部分。它应该使用接受类型而不是对象的as(它们的用途不同(。

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

你完了。

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

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

您应该根据Encoders文档对案例类使用Encoders.product方法:

Scala产品类型(元组、事例类等(的编码器。

尝试按如下方式更改:

val men = Encoders.product[MyCase]

对于任何试图将Dataframe的行转换为case类并使用:的人

case class Person(id: Long, name: String)

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

但只得到一个错误,说";找不到类型…的编码器">

import scala3encoders.given为我解决了问题…

最新更新