2017-06-21 2 views
0

J'essaie de décomposer la structure d'une structure de données complexe en étincelle. Je suis seulement intéressé par les tableaux imbriqués sous la racine. Le problème est que je ne peux pas récupérer le ElementType à partir du type de StructField.Comment extraire le ElementType d'un tableau en tant qu'instance de StructType

Voici un exemple, ce schéma d'un objet StructType:

df.printSchema 
result>> 
root 
|-- ID: string (nullable = true) 
|-- creationDate: string (nullable = true) 
|-- personsList: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- firstName: string (nullable = true) 
| | |-- lastName: string (nullable = true) 

Chaque StructType est un tableau de

FieldType (name, type, nullable , metadata). 

J'ai essayé le code ci-dessous:

val personsList = df.schema("personsList") // personsList is a StructField 
println(passengersList.dataType) 

I aimerait récupérer le ElementType pour avoir le StructType du tableau imbriqué, mais malheureusement nous avons seulement TypeName ou méthode json.

Meilleures salutations,

Répondre

1

Vous pouvez sélectionner la elements de arraystruct et obtenir le dataType

val arraydf = df.select ("personsList.firstName", "personsList.lastName") arraydf.schema .foreach (x => println (x.dataType))

Cela donnera suite à dataType

ArrayType(StringType,true) 
ArrayType(StringType,true) 

Ci-dessus a donné arrayType qui, je suppose, n'est pas ce dont vous avez besoin. Vous pouvez aller un pas en avant d'utiliser explodefunction

val arraydf = df.select(explode($"personsList.firstName")) 
arraydf.schema.foreach(x => println(x.dataType)) 

Ce imprimera

StringType 

J'espère que c'est ce que vous vouliez. Sinon, il vous donnera des idées :)

+0

Merci, j'ai une question: Je ne suis intéressé que par le schéma, je me demande si la déclaration "select" récupère aussi les enregistrements même si nous ne montrons pas ou n'utilisons pas leur. (Je suis censé avoir des millions de disques et je ne les utiliserai pas) qu'en penses-tu? –

+0

Oui, l'instruction 'select' générera une nouvelle trame de données pour les colonnes sélectionnées. Mais si vous n'utilisez pas la structure de données sélectionnée, elle doit être récupérée lors de l'expiration de la portée. Vous n'avez donc pas besoin de vous inquiéter d'avoir des millions d'enregistrements. –

+0

Merci pour votre temps –