Spark Scala Int与Integer的Option vs StructType

时间:2019-03-06 21:01:34

标签: scala apache-spark

为什么可以为案例类做

fieldn: Option[Int]

fieldn: Option[Integer]

但是我必须使用StructType吗?

StructField("fieldn", IntegerType, true),

2 个答案:

答案 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那里没有任何地方。