如何将GroupedDataset保存到镶木地板或将其转换为toDF

时间:2017-10-09 13:16:36

标签: scala apache-spark group-by apache-spark-dataset

我正在使用spark 1.6.1。

是否有可用于将GroupDataset保存到镶木地板文件的API。 或者将其转换为DataFrame。

E.g。我有一个自定义对象'过程',我已将Dataframe转换为过程对象。 之后,我正在使用patientID进行分组。 我想将dbs分组到镶木地板文件或将其作为Dataframe传递给其他函数。 我没有获得任何存储API或将其转换为Dataframe。

val procedureDs: Dataset[Procedure] = joinDf.select("patientid", "patientprocedureid", "procedurecode").as[Procedure]
val groupedDs:GroupedDataset[Long, Procedure] = procedureDs.groupBy{ x => x.patientid } 

应用mapGroups后

val a = groupedDs.mapGroups{ case (k,vs) => { (k, vs.toSeq)}}

它给出了以下错误:

Exception in thread "main" java.lang.UnsupportedOperationException: No Encoder found for com.....PatientDiagnosis
- array element class: "com....PatientDiagnosis"
- field (class: "scala.collection.Seq", name: "_2")
- root class: "scala.Tuple2"

我曾试图给出明确的编码器

val a = groupedDigDs.mapGroups((k,vs) =>  (k, vs.toSeq))(org.apache.spark.sql.Encoders.bean(classOf[(Long, Seq[com....PatientDiagnosis])]))

然后将错误更改为:

 java.lang.UnsupportedOperationException: Cannot infer type for class scala.Tuple2 because it is not bean-compliant

1 个答案:

答案 0 :(得分:2)

GroupedData(Spark 2.x中的RelationalGroupedDataset)相同,GroupedDataset(Spark 2.x中的KeyValueGroupedDataset)必须在保存之前进行聚合。< / p>

如果您的目标是另一个groupByKey,则可以使用mapGroups

val groupedDs: GroupedDataset[K, V] = ???
// ... { case (k, xs) => (k, xs.toSeq) }  to preserve key as well
groupedDs.mapGroups { case (_, xs) => xs.toSeq }

并写下结果。