2016-02-15 21 views
14

Tôi đã có tệp JSON nàylỗi _corrupt_record khi đọc một tệp JSON vào Spark

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

đã được thu được bằng phương pháp Python json.dump. Bây giờ, tôi muốn đọc tệp này vào một DataFrame trong Spark, sử dụng pyspark. Sau tài liệu hướng dẫn, tôi đang làm điều này

sc = SparkContext()

sqlc = SQLContext (sc)

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

in df.show()

tuyên bố in spits ra này mặc dù:

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

Bất cứ ai cũng biết điều gì đang diễn ra và tại sao nó không diễn giải chính xác tệp?

Trả lời

26

Bạn cần có một đối tượng json mỗi dòng trong tập tin đầu vào của bạn, xem http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader.json

Nếu tệp json của bạn trông như thế này nó sẽ cung cấp cho bạn dataframe mong đợi:

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

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

Làm cách nào để khắc phục nếu tệp JSON của tôi lớn (một vài hàng 100 nghìn) và có nhiều dòng mới giữa các bản ghi (cột hoặc đối tượng)? cảm ơn. –

2

Thêm vào @ Bernhard của câu trả lời tuyệt vời

# 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

Đoán điều này có thể là một bình luận cho câu trả lời? –

3

Nếu bạn muốn để tệp JSON của bạn giống như (không có ký tự dòng mới \n), bao gồm multiLine=True đối số từ khóa

sc = SparkContext() 
sqlc = SQLContext(sc) 

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

print df.show() 
Các vấn đề liên quan