Spark Scala Int против Integer для Option против StructType - PullRequest
0 голосов
/ 07 марта 2019

Почему для класса дел я могу сделать

fieldn: Option[Int]

или

fieldn: Option[Integer]

а для StructType я должен использовать?

StructField("fieldn", IntegerType, true),

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Я понимаю, почему это кажется противоречивым - причина в удобстве.Удобнее дать 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 преобразование выполняется для вас следующим образом: кодировщик .Вы можете увидеть тонну конверсий в ExpressionEncoderSuite

1 голос
/ 07 марта 2019

Optional тип обозначает объекты, которые могут быть неопределенными (None).Так что это в основном применимо к данным.

В вашем примере StructField нет позиции, в которой он мог бы быть осмысленно использован:

Схема должна быть определена так, что

Option[StructField]  

и не предоставляет никакой информации о типе, не является семантически правдивым и что-либо вокруг

Option[DataType] 

или

Option[IntegerType]

то есть

StructField("fieldn", Some(IntegerType): )

будетиметь еще меньший смысл - либо создание объекта с неясной семантикой (прежней), либо невозможным API.

Фундаментально StructType представляет обязательные метаданные.Он не может быть пропущен по замыслу, и поэтому Option не имеет места там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...