web-dev-qa-db-fra.com

pyspark dataframe ajouter une colonne si elle n'existe pas

J'ai des données json dans divers fichiers json Et les touches peuvent être différentes en lignes, par exemple

{"a":1 , "b":"abc", "c":"abc2", "d":"abc3"}
{"a":1 , "b":"abc2", "d":"abc"}
{"a":1 ,"b":"abc", "c":"abc2", "d":"abc3"}

Je veux agréger les données sur les colonnes 'b', 'c', 'd' et 'f' qui ne sont pas présentes dans le fichier json donné mais pourraient être présentes dans les autres fichiers. SO comme la colonne 'f' n'est pas présente, nous pouvons prendre une chaîne vide pour cette colonne.

Je lis le fichier d'entrée et j'agrège les données comme ceci

import pyspark.sql.functions as f
df =  spark.read.json(inputfile)
df2 =df.groupby("b","c","d","f").agg(f.sum(df["a"]))

Ceci est la sortie finale que je veux

{"a":2 , "b":"abc", "c":"abc2", "d":"abc3","f":"" }
{"a":1 , "b":"abc2", "c":"" ,"d":"abc","f":""}

Quelqu'un peut-il aider s'il vous plait? Merci d'avance!

8
gashu

Vous pouvez vérifier si la colonne est disponible dans la trame de données et modifier df uniquement si nécessaire:

if not 'f' in df.columns:
   df = df.withColumn('f', f.lit(''))

Pour les schémas imbriqués, vous devrez peut-être utiliser df.schema Comme ci-dessous:

>>> df.printSchema()
root
 |-- a: struct (nullable = true)
 |    |-- b: long (nullable = true)

>>> 'b' in df.schema['a'].dataType.names
True
>>> 'x' in df.schema['a'].dataType.names
False
13
Mariusz