2017-07-21 1 views
1

Je suis en train d'écrire un jeu de données à JSON en utilisant:écrire une étincelle dataSet JSON avec toutes les clés du schéma, y ​​compris les colonnes null

ds.coalesce(1).write.format("json").option("nullValue",null).save("project/src/test/resources") 

Pour les enregistrements qui ont des colonnes avec des valeurs nulles, le document JSON ne pas écrire cette clé du tout.

Existe-t-il un moyen d'appliquer des clés de valeur nulle à la sortie json? Ceci est nécessaire puisque j'utilise ce json pour le lire sur un autre jeu de données (dans un cas de test) et que je ne peux pas appliquer un schéma si certains documents n'ont pas toutes les clés dans la classe case (je le lis en mettant le fichier json sous le dossier des ressources et la transformation en un ensemble de données via RDD [String], comme expliqué ici: https://databaseline.bitbucket.io/a-quickie-on-reading-json-resource-files-in-apache-spark/)

+0

Vous pouvez remplacer 'null' par une chaîne vide, puis écrire dans JSON. – philantrovert

+0

essayé, ça ne marche pas. Donc, cela changerait la valeur et les données et je cherche à garder les données intactes –

+0

Donc le fait est que vous pouvez encore remplacer ces chaînes vides par 'null' quand vous recréerez l'image en lisant le fichier JSON. Mais ce serait plus facile si toutes vos colonnes sont 'String'. Sont-ils? – philantrovert

Répondre

1

Je suis d'accord avec @philantrovert.

ds.na.fill("") 
    .coalesce(1) 
    .write 
    .format("json") 
    .save("project/src/test/resources") 

Depuis DataSets sont immuables, vous n'êtes pas modifier les données dans ds et vous pouvez le traiter (avec des valeurs nulles et tous) dans tout code ci-dessous. Vous remplacez simplement les valeurs nulles par une chaîne vide dans le fichier enregistré.

+0

Merci pour l'entrée. Je comprends ce que vous dites, cependant ces données seront utilisées pour les cas de test et seront comparées avec les ds du projet, qui contient des valeurs nulles. Je suppose que je peux mettre une valeur là-bas et ensuite le remplacer par NULL manuellement –