我在尝试将数据帧转换为数据集以便运行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
为我解决了问题…