Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 取而代之的是,将数据帧提取到Case类中会导致读取Tuple1_Scala_Apache Spark - Fatal编程技术网

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
的解释。