为什么可以为案例类做
fieldn: Option[Int]
或
fieldn: Option[Integer]
但是我必须使用StructType吗?
StructField("fieldn", IntegerType, true),
答案 0 :(得分:2)
我了解为什么看起来不一致-原因是方便。给Spark一个case class
更为方便,因为它们在Scala中非常容易使用。
在后台,Spark正在使用您提供的case class
并使用它来确定DataFrame的架构。这意味着所有Java / Scala类型都将在后台转换为Spark SQL的类型。例如,对于以下案例类:
case class TestIntConversion(javaInteger: java.lang.Integer, scalaInt: scala.Int, scalaOptionalInt: Option[scala.Int])
您将获得这样的架构:
root
|-- javaInteger: integer (nullable = true)
|-- scalaInt: integer (nullable = false)
|-- scalaOptionalInt: integer (nullable = true)
在最新版本的Spark中,为您进行转换的是Encoder。您可以在ExpressionEncoderSuite
中看到大量的转化答案 1 :(得分:1)
Optional
类型表示可以不确定的对象(None
)。因此它主要适用于数据。
在您的StructField
示例中,没有可以有效使用它的位置:
必须这样定义架构
Option[StructField]
并且不提供有关类型的任何信息,也不是语义上真实的,并且不包含任何内容
Option[DataType]
或
Option[IntegerType]
即
StructField("fieldn", Some(IntegerType): )
毫无意义-创建具有不清楚语义(以前)或不可能的API的对象。
基本StructType
代表强制性元数据。设计不会丢失它,因此Option
那里没有任何地方。