3
votes

Comment supprimer le guillemet double lorsque la valeur est vide dans Spark?

Je voudrais supprimer les guillemets doubles "" lorsque la valeur est vide lors de l'enregistrement de mon CSV dans S3 avec la méthode df.write.save () de Spark

Version Spark: 2.4.0

Version Python: 3.6.5

Voici mon code en Python pour charger le fichier csv:

|id|first_name|last_name|zip_code|
|1 |""        |Elsner   |57315   |
|2 |Noelle    |""       |""      |
|3 |James     |Moser    |48256   |

Le fichier CSV chargé: p>

df.write.save(
    path('out'),
    format = 'csv',
    delimiter = '|',
    header = 'true'
)

Voici mon code en Python pour écrire le fichier csv:

|id|first_name|last_name|zip_code|
|1 |          |Elsner   |57315   |
|2 |Noelle    |         |        |
|3 |James     |Moser    |48256   |

Le fichier CSV écrit:

XXX

Comment supprimer le double guillemet lors de l'inscription?

Merci beaucoup d'avance.


0 commentaires

5 Réponses :


2
votes

Vous avez une chaîne vide dans votre bloc de données, si vous voulez les écrire sous forme de valeurs nulles, vous pouvez remplacer la chaîne vide par null, puis définir nullValues ​​= None lors de son enregistrement:

id|first_name|last_name|zip_code
1||Elsner|57315
2|Noelle||
3|James|Moser|48256

Et il sera enregistré sous:

df.replace('', None)              # replace empty string with null
  .write.save(
    path('out'), 
    format='csv', 
    delimiter='|', 
    header=True, 
    nullValue=None                # write null value as None
  )


0 commentaires

5
votes

Selon Spark documentation , la valeur par défaut de nullValue et emptyValue est None , et se traduira par une chaîne vide. Pour le définir sur rien réel, comme vous le souhaitez, vous pouvez le définir sur Unicode NULL:

df.write.save(
    path('out'),
    format = 'csv',
    delimiter = '|',
    header = True,
    nullValue = '\u0000',
    emptyValue = '\u0000'
)


0 commentaires

3
votes

Aucune des solutions ci-dessus n'a fonctionné pour moi, mais elles ont été utiles pour me guider dans la bonne direction. Ce qui a fini par fonctionner a été d'ajouter l'option emptyValue = u '\ u0000' (quand j'ai essayé sans le u précédent, cela a fini par écrire \ u0000 littéraire au fichier csv)


0 commentaires

2
votes

Si vous cherchez la manière PySpark de faire cela, n'essayez pas d'utiliser l'astuce des chaînes nulles! C'est beaucoup plus simple (une fois que vous connaissez le truc ...)

myDF.coalesce(1).write\
    .option("emptyValue", None)\
    .option("nullValue", None)\
    .csv(outFile)

J'espère que cela aide! Impossible de le trouver documenté nulle part


0 commentaires

1
votes

data.write.format ("csv"). option ("delimiter", "|"). option ("emptyValue", "") .option ("nullValue", "") .option ("header" , "true"). mode ("overwrite"). save ("C: \ data \ test2")


0 commentaires