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

问题描述 投票:3回答:2

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

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

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

更新

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

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

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

解决方案更新

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

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

scala apache-spark frameless
2个回答
9
投票

我们只为我们支持in SQLImplicits的类型子集定义了implicits。我们应该考虑为常见的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()

2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.