2016-02-15 12 views
14

Mam ten plik JSONbłąd _corrupt_record podczas odczytu pliku JSON do Spark

{ 
    "a": 1, 
    "b": 2 
} 

który został uzyskany metodą Pythona json.dump. Teraz chcę przeczytać ten plik w DataFrame w Spark, używając pyspark. Następujące dokumenty, robię to

sc = SparkContext()

sqlc = SqlContext (SC)

df = sqlc.read.json ('my_file.json')

druku df.show()

Instrukcja print wypluwa to jednak:

+---------------+ 
|_corrupt_record| 
+---------------+ 
|    {| 
|  "a": 1, | 
|   "b": 2| 
|    }| 
+---------------+ 

Ktoś wie, co się dzieje i dlaczego nie interpretuje poprawnie pliku?

Odpowiedz

26

Trzeba mieć jeden obiekt json każdym wierszu w pliku wejściowego, patrz http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader.json

Jeśli plik json wygląda to daje oczekiwany dataframe:

{ "a": 1, "b": 2 } 
{ "a": 3, "b": 4 } 

.... 
df.show() 
+---+---+ 
| a| b| 
+---+---+ 
| 1| 2| 
| 3| 4| 
+---+---+ 
+0

Jak mogę to naprawić, jeśli mój plik JSON jest ogromny (kilka rzędów 100K) i ma wiele nowych linii pomiędzy ewidencji (kolumn lub funkcji)? dzięki. –

2

dodanie do @ Bernharda wielki odpowiedź

# 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') 
+0

Zgadnij, czy może to być komentarz do odpowiedzi? –

3

Jeśli chcesz zostawić swój plik JSON, jak to jest (bez usuwania nowych linii znaki \n) obejmują multiLine=True kluczowe argumentem

sc = SparkContext() 
sqlc = SQLContext(sc) 

df = sqlc.read.json('my_file.json', multiLine=True) 

print df.show()