web-dev-qa-db-fra.com

Erreur _corrupt_record lors de la lecture d'un fichier JSON dans Spark

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?

27
mar tin

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|
+---+---+
41
Bernhard

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()
25
wiggy

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)
6
Murtaza Zaveri

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')
3
George Fisher