Scala 取而代之的是,将数据帧提取到Case类中会导致读取Tuple1
给定一个Scala 取而代之的是,将数据帧提取到Case类中会导致读取Tuple1,scala,apache-spark,Scala,Apache Spark,给定一个案例类: case class ScoringSummary(MatchMethod: String="", TP: Double=0, FP: Double=0, Precision: Double=0, Recall: Double=0, F1: Double=0) 我们将简要记录如下: summaryDf.write.parquet(path) 稍后,我们(尝试)将拼花地板文件读入一个新的数据框: implicit val generalRowEncoder: Enc
案例类
:
case class ScoringSummary(MatchMethod: String="",
TP: Double=0,
FP: Double=0,
Precision: Double=0,
Recall: Double=0,
F1: Double=0)
我们将简要记录如下:
summaryDf.write.parquet(path)
稍后,我们(尝试)将拼花地板文件读入一个新的数据框:
implicit val generalRowEncoder: Encoder[ScoringSummary] =
org.apache.spark.sql.Encoders.kryo[ScoringSummary]
val summaryDf = spark.read.parquet(path).as[ScoringSummary]
但这失败了-出于某种原因,spark
认为数据的内容是Tuple1
而不是ScoringSummary
:
Try to map struct<MatchMethod:string,TP:double,FP:double,Precision:double,
Recall:double,F1:double> to Tuple1,
but failed as the number of fields does not line up.;
at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveDeserializer$
.org$apache$spark$sql$catalyst$analysis$Analyzer$
ResolveDeserializer$$fail(Analyzer.scala:2168)
尝试将struct映射到Tuple1,
但由于字段数不一致而失败。;
位于org.apache.spark.sql.catalyst.analysis.Analyzer$resolvedesideserializer$
.org$apache$spark$sql$catalyst$analysis$Analyzer$
ResolveDeserializer$$fail(Analyzer.scala:2168)
对于正确的翻译,哪个步骤/设置丢失/不正确?使用导入spark.implicits.\u
而不是注册编码器
我忘了需要导入spark.implicits
。不正确的方法是添加编码器:即不要包含以下行
implicit val generalRowEncoder: Encoder[ScoringSummary] =
org.apache.spark.sql.Encoders.kryo[ScoringSummary] // Do NOT add this Encoder
以下是删除编码器
行时出现的错误
错误:(59113)找不到数据集中存储的类型的编码器。
基本类型(Int、String等)和产品类型(case类)
通过导入spark.implicits来支持。支持序列化
其他类型将在将来的版本中添加。
val summaryDf=ParquetLoader.loadParquet(sparkEnv,res.state.dfs(ScoringSummaryTag).copy(df=None)).df.get.as[ScoringSummary]
相反,应该添加以下代码
import spark.implicits._
同样的代码也可以工作:
val summaryDf = spark.read.parquet(path).as[ScoringSummary]
顺便说一句:案例类
或原语
类型不需要编码器:以上是案例类
kryo
对于复杂的对象类型变得很方便。如果你想要kryo怎么办?@RaphaelRoth在回答中补充了关于为什么/何时需要kryo
的解释。