Modifier la propriété nullable de la colonne dans la structure de données spark
Je suis création manuelle d'un dataframe pour certains tests. Le code pour créer c'est:
case class input(id:Long, var1:Int, var2:Int, var3:Double)
val inputDF = sqlCtx
.createDataFrame(List(input(1110,0,1001,-10.00),
input(1111,1,1001,10.00),
input(1111,0,1002,10.00)))
De sorte que le schéma ressemble à ceci:
root
|-- id: long (nullable = false)
|-- var1: integer (nullable = false)
|-- var2: integer (nullable = false)
|-- var3: double (nullable = false)
Je veux faire "nullable = true' pour chacune de ces variables. Comment dois-je déclarer que, depuis le début ou le basculer dans une nouvelle dataframe après, il a été créé?
source d'informationauteur J Calbreath
Vous devez vous connecter pour publier un commentaire.
Réponse
Avec les importations
vous pouvez utiliser
directement.
Vous pouvez également faire la méthode disponible via le "pimp my library" (bibliothèque de modèle ( voir mon post Quelle est la meilleure façon de définir des méthodes personnalisées sur un DataFrame? ), de sorte que vous pouvez appeler
Modifier
Solution Alternative 1
Utiliser une légère version modifiée de
setNullableStateOfColumn
Solution Alternative 2
Explicitement définir le schéma. (Utiliser la réflexion pour créer une solution qui est plus général)
C'est une réponse tardive, mais je voulais donner une solution alternative pour les gens qui viennent ici. Vous pouvez automatiquement faire une
DataFrame
Column
nullable dès le départ par la suite à la modification de votre code:Cela donnera:
Essentiellement, si vous déclarez un champ comme un
Option
en utilisantSome([element])
ouNone
comme les entrées, alors que le champ d'accepter les valeurs null. Sinon, le champ ne sera pas les valeurs null. J'espère que cela aide!Plus compact version de réglage de toutes les colonnes nullable paramètre
Au lieu de
case StructField( c, t, _, m) ⇒ StructField( c, t, nullable = nullable, m)
on peut utiliser_.copy(nullable = nullable)
. Puis l'ensemble de la fonction peut être écrite comme suit:Suffit d'utiliser java.lang.Entiers à la place de la scala.Int dans votre classe de cas.
Une autre option, si vous avez besoin de changer dataframe en place, et la recréation est impossible, vous pouvez faire quelque chose comme ceci:
Étincelle va alors penser que cette colonne peut contenir des
null
et la possibilité de valeur null sera mis àtrue
.Aussi, vous pouvez utiliser
udf
, pour envelopper vos valeurs dansOption
.Fonctionne très bien, même pour le streaming des cas.