2016-09-08 1 views
0

J'utilise Spark-MongoDB et je suis en train d'enregistrer une trame de données dans MongoDB:Spark dataframe est enregistré MongoDB au mauvais format

val event = """{"Dev":[{"a":3},{"b":3}],"hr":[{"a":6}]}""" 
val events = sc.parallelize(event :: Nil) 
val df = sqlc.read.json(events) 
val saveConfig = MongodbConfigBuilder(Map(Host -> List("localhost:27017"), 
Database -> "test", Collection -> "test", SamplingRatio -> 1.0, WriteConcern -> "normal", 
SplitSize -> 8, SplitKey -> "_id")) 
df.saveToMongodb(saveConfig.build) 

J'attends les données à enregistrer en tant que la chaîne d'entrée, mais ce qui est réellement sauvé est:

{ "_id": ObjectId ("57cedf4bd244c56e8e783a45"), "Dev": [{ "a": NumberLong (3), "b": null}, { "a" : null, "b": NumberLong (3)}], "hr": [{"a": NumberLong (6)}]}

Je veux éviter ces valeurs nulles et les doublons, Une idée?

+0

Il n'y a pas de doublons ici et explicite 'null' devrait. Il s'agit exactement du format obtenu à partir de JSON analysé lorsqu'il est mappé au schéma Spark. – zero323

+0

Alors, y a-t-il un moyen de mapper le format original (sans nul) avant de sauvegarder? –

+0

C'est parce que vous importez les données json dans un DataFrame et que vous définissez le schéma pour toutes les données. Si le connecteur le supporte, utilisez 'SparkContext' à la place et sauvegardez le RDD. A défaut, le https://docs.mongodb.com/spark-connector/ le supporte. – Ross

Répondre

0

Avez-vous essayé événement défini comme ci-dessous en utilisant la barre oblique inverse:

val event = "{\"Dev\":[{\"a\":3},{\"b\":3}],\"hr\":[{\"a\":6}]}"