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

时间:2018-12-14 16:21:21

标签: 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: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 :(得分:1)

您不需要显式编码器即可将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]

您完成了。

答案 1 :(得分:0)

您应根据Encoders.product文档将Encoders方法用于案例类:

  

Scala产品类型(元组,案例类等)的编码器。

尝试如下更改:

val men = Encoders.product[MyCase]

答案 2 :(得分:0)

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

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