【问题标题】:How to convert DataFrame to Dataset[CaseClass]?如何将 DataFrame 转换为 Dataset [Case Class]?
【发布时间】:2019-12-23 22:56:28
【问题描述】:

我在尝试将我的 Dataframe 转换为 Dataset 以便我可以运行 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]

【问题讨论】:

  • 你在哪里定义案例类?您是输入到spark-shell 的行还是它们是 Spark 应用程序的一部分?

标签: scala apache-spark apache-spark-sql


【解决方案1】:

您不需要显式编码器来将 DataFrame(= Rows 的数据集)转换为 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]

你已经完成了。

【讨论】:

  • Person 来自哪里?
  • @matanster 这只是一个示例案例类。将其添加到答案中。
【解决方案2】:

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

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

【讨论】:

  • 您使用什么 Spark 版本?这是您的 Spark 应用程序中唯一的更改,还是其他建议的更改(包括我的)也需要?
  • 按照@JacekLaskowski 所说的那样使用.product 之后,我将代码移到了对象上方
【解决方案3】:

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

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

尝试如下更改:

val men = Encoders.product[MyCase]

【讨论】:

    猜你喜欢
    • 2017-04-03
    • 2017-04-17
    • 2022-07-28
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多