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

时间:2016-04-06 11:09:02

标签: scala apache-spark frameless

是否可以在与Dataset API一起使用的案例类中使用Option[_]成员?例如。 Option[Int]

我试图找到一个例子,但还没找到。这可以通过自定义编码器(映射?)来完成,但我还没有找到一个例子。

使用Frameless库可以实现这一点:https://github.com/adelbertc/frameless但应该有一种简单的方法可以使用基本的Spark库来完成它。

更新

我正在使用:"org.apache.spark" %% "spark-core" % "1.6.1"

尝试使用Option [Int]时出现以下错误:

  

无法找到存储在数据集中的类型的编码器。原始类型   (Int,String等)和产品类型(案例类)受支持   import sqlContext.implicits._支持序列化其他类型   将在未来版本中添加

解决方案更新

由于我是原型设计,我只是在转换为数据集之前在函数内部声明了case类(在我的情况下是object Main {内部)。

当我将案例类移到Main函数之外时,选项类型工作正常。

2 个答案:

答案 0 :(得分:9)

我们只为我们支持的in SQLImplicits类型的子集定义了隐含。我们应该考虑为公共Option[T]添加T,因为内部基础架构了解Option。您可以通过创建case class,使用Tupleconstructing the required implicit yourself来解决此问题(虽然这是使用内部API,因此可能会在以后的版本中中断)。

implicit def optionalInt: org.apache.spark.sql.Encoder[Option[Int]] = org.apache.spark.sql.catalyst.encoders.ExpressionEncoder()

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

答案 1 :(得分:2)

"将来版本中将添加对序列化其他类型的支持"。定制编码器尚未得到支持,但显然已经计划好了。你可以尝试自己实现这个特性,但肯定没有官方的例子。

一种选择是使用Seq[Int]成员并确保其最多只有一个值。

相关问题