是否可以在与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函数之外时,选项类型工作得很好。
我们只为我们支持in SQLImplicits的类型子集定义了implicits。我们应该考虑为常见的Option[T]
添加T
,因为内部基础设施确实了解Option
。您可以通过创建case class
,使用Tuple
或constructing 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()
“将来版本中将添加对序列化其他类型的支持”。虽然显然已经计划好了,但是不支持自定义编码器。你可以尝试自己实现这个特性,但肯定没有官方的例子。
一种选择是使用Seq[Int]
成员并确保它最多只有一个值。