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 如何为选项类型构造函数创建编码器,例如选项[Int]?_Scala_Apache Spark_Frameless - Fatal编程技术网

Scala 如何为选项类型构造函数创建编码器,例如选项[Int]?

Scala 如何为选项类型构造函数创建编码器,例如选项[Int]?,scala,apache-spark,frameless,Scala,Apache Spark,Frameless,是否可以在与Dataset API一起使用的case类中使用选项[\u]成员?例如,选项[Int] 我试图找到一个例子,但还没有找到。这可能可以通过自定义编码器(映射?)实现,但我还没有找到这样的示例 使用无框架库可能可以实现这一点:但是应该有一种简单的方法来使用基本的Spark库实现 更新 我正在使用:“org.apache.spark”%%“spark core”%%“1.6.1” 在尝试使用选项[Int]时出现以下错误: 找不到数据集中存储的类型的编码器。基本类型 (Int、String等

是否可以在与Dataset API一起使用的case类中使用
选项[\u]
成员?例如,
选项[Int]

我试图找到一个例子,但还没有找到。这可能可以通过自定义编码器(映射?)实现,但我还没有找到这样的示例

使用无框架库可能可以实现这一点:但是应该有一种简单的方法来使用基本的Spark库实现

更新

我正在使用:
“org.apache.spark”%%“spark core”%%“1.6.1”

在尝试使用选项[Int]时出现以下错误:

找不到数据集中存储的类型的编码器。基本类型 (Int、String等)和产品类型(case类)由 导入sqlContext.implicits.\支持序列化其他类型 将在将来的版本中添加

解决方案更新

由于我正在进行原型设计,所以在转换到数据集之前,我只是在函数中声明了case类(在我的例子中是在
objectmain{
中)

当我将case类移到Main函数之外时,选项类型工作得很好。

“对序列化其他类型的支持将在将来的版本中添加”。虽然自定义编码器显然是计划好的,但还不受支持。您可以尝试自己实现该特性,但肯定没有正式的示例


一个选项是使用<代码> SEQ[INT] < /Cord>成员,并确保它最多只有一个值。

< P>我们只定义了对所支持类型的子集的引用。我们应该考虑添加<代码>选项[t]。用于公共
T
,因为内部基础结构确实理解
选项
。您可以通过创建
案例类
、使用
元组
或(尽管这使用的是内部API,因此在未来版本中可能会中断)来解决此问题


你可以把这个答案和我上面的评论结合起来——一个名为
optionant
的案例类,围绕着一个
Seq[Int]
。然后你可以在case类中实现
已定义
isEmpty
get
甚至
getOrElse
。@DavidGriffin:你能为这个问题添加一个答案吗?我的Scala有点生锈了。我会同时尝试实现它。@Alexey Romanov:看起来
Seq[Int]
也被视为未移植类型,因此它不会工作。@RăzvanPanda奇怪,它列在中。@AlexeyRomanov我明白了,你介意试一试吗?也许我做错了什么,但它对我不起作用。我发现了我所犯的错误,似乎scala对待在函数内部和外部声明case类的方式不同。Decla在Main之外调用case类可以使
as[\u]
函数在没有任何额外隐式的情况下正常工作。我尝试使用您提到的隐式,但无法使其工作(对于在函数内部定义case类的情况,例如Main).My datasource是一个MS SQL Server DB。由于某些原因,时间戳类型编码可以工作,但GregorianCalendar不能工作,这两种编码都没有列在AlexeyRomanov评论中提到的文件中
implicit def optionalInt: org.apache.spark.sql.Encoder[Option[Int]] = org.apache.spark.sql.catalyst.encoders.ExpressionEncoder()

val ds = Seq(Some(1), None).toDS()