2017-03-31 1 views
2

Donc, pour quelque chose comme ceci:Pourquoi Spark SQL active-t-il la valeur NULL pour la colonne de chaîne même lorsque toutes les valeurs sont spécifiées?

case class RandomClass(stringOne: String, stringTwo: String, numericOne: Int) 
val ds = Seq(
    RandomClass("a", null, 1), 
    RandomClass("a", "x", 3), 
    RandomClass("a", "y", 4), 
    RandomClass("a", null, 5) 
).toDS() 

ds.printSchema() 

résultats dans

root 
|-- stringOne: string (nullable = true) 
|-- stringTwo: string (nullable = true) 
|-- numericOne: integer (nullable = false) 

pourquoi serait stringOne être nullable? Étrangement, numericOne est correctement inféré. Je suppose que je manque juste quelque chose sur la relation entre Dataset et DataFrame API?

Répondre

2

pourquoi serait stringOne être annulable

Parce que Scala String est juste une chaîne Java et contrairement à Scala Int peut être null. Le contenu réel (présence de null valeurs ou l'absence de celui-ci) n'a tout simplement pas d'importance.

Voir aussi spark why do columns change to nullable true

1

Il est vrai que Spark fait une meilleure estimation de la nullabilité selon que le type inféré se trouve du côté AnyRef ou AnyVal de la hiérarchie des objets Scala, mais notez aussi qu'il peut être plus compliqué que ça. Par exemple, lorsque vous travaillez avec des fichiers Parquet, tout est inféré comme étant nullable à des fins de compatibilité.

Pendant ce temps, lorsque vous créez un schéma, vous pouvez simplement mettre nullable = true partout si vous aimez:

StructField(fieldName, LongType, nullable = true) 

// or using a "DSL" 
$"fieldName".long.copy(nullable = false)