J'ai ce fichier JSON
{
"a": 1,
"b": 2
}
qui a été obtenu avec Python json.dump. Maintenant, je veux lire ce fichier dans un DataFrame dans Spark, en utilisant pyspark. La documentation suivante, je le fais
sc = SparkContext ()
sqlc = SQLContext (sc)
df = sqlc.read.json ('mon_fichier.json')
print df.show ()
L'instruction print crache ceci cependant:
+---------------+
|_corrupt_record|
+---------------+
| {|
| "a": 1, |
| "b": 2|
| }|
+---------------+
Quelqu'un sait ce qui se passe et pourquoi il n'interprète pas correctement le fichier?
Vous devez avoir un objet json par ligne dans votre fichier d'entrée, voir http://spark.Apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader.json
Si votre fichier json ressemble à ceci, il vous donnera la trame de données attendue:
{ "a": 1, "b": 2 }
{ "a": 3, "b": 4 }
....
df.show()
+---+---+
| a| b|
+---+---+
| 1| 2|
| 3| 4|
+---+---+
Si vous souhaitez laisser votre fichier JSON tel quel (sans supprimer les nouvelles lignes, les caractères \n
), comprendre multiLine=True
argument de mot clé
sc = SparkContext()
sqlc = SQLContext(sc)
df = sqlc.read.json('my_file.json', multiLine=True)
print df.show()
Dans Spark 2.2+, vous pouvez lire le fichier json de multiligne en utilisant la commande suivante.
val dataframe = spark.read.option("multiline",true).json( " filePath ")
s'il y a un objet json par ligne alors,
val dataframe = spark.read.json(filepath)
Ajout à la grande réponse de @ Bernhard
# original file was written with pretty-print inside a list
with open("pretty-printed.json") as jsonfile:
js = json.load(jsonfile)
# write a new file with one object per line
with open("flattened.json", 'a') as outfile:
for d in js:
json.dump(d, outfile)
outfile.write('\n')