2015-04-21 24 views
6

Tôi có danh sách các từ điển lồng nhau, ví dụ: ds = [{'a': {'b': {'c': 1}}}] và muốn tạo một DataFrame tia lửa từ nó trong khi suy luận lược đồ của từ điển lồng nhau. Sử dụng sqlContext.createDataFrame(ds).printSchema() mang lại cho tôi sau schemaTạo DataFrame Spark từ từ điển lồng nhau

root 
|-- a: map (nullable = true) 
| |-- key: string 
| |-- value: map (valueContainsNull = true) 
| | |-- key: string 
| | |-- value: long (valueContainsNull = true) 

nhưng những gì tôi cần là

root 
|-- a: struct (nullable = true) 
| |-- b: struct (nullable = true) 
| | |-- c: long (nullable = true) 

Giản đồ thứ hai này có thể được tạo ra bằng cách đầu tiên chuyển đổi từ điển để JSON và sau đó tải nó với jsonRDD như sqlContext.jsonRDD(sc.parallelize([json.dumps(ds[0])])).printSchema() này. Nhưng điều này sẽ khá cồng kềnh đối với các tệp lớn.

Tôi đã nghĩ về việc chuyển từ điển thành pyspark.sql.Row() đối tượng hy vọng rằng khung dữ liệu sẽ suy ra lược đồ, nhưng nó không hoạt động khi từ điển có các lược đồ khác nhau (ví dụ: đầu tiên thiếu một số khóa).

Có cách nào khác để thực hiện việc này không? Cảm ơn!

Trả lời

2

Tôi nghĩ điều này sẽ hữu ích.

import json 
ds = [{'a': {'b': {'c': 1}}}] 
ds2 = [json.dumps(item) for item in ds] 
df = sqlCtx.jsonRDD(sc.parallelize(ds2)) 
df.printSchema() 

Sau đó,

root 
|-- a: struct (nullable = true) 
| |-- b: struct (nullable = true) 
| | |-- c: long (nullable = true) 
+0

tôi muốn tránh điều đó (xem câu hỏi của tôi). Tôi đã hy vọng có một cách để làm điều đó mà không cần phải tạo RDD từ các bộ từ điển chỉ để có được lược đồ của nó. – Marigold

+1

Xin lỗi vì đã bỏ lỡ đoạn giữa của bạn. Thật không may, tính năng 'lược đồ suy luận từ từ điển' không còn được dùng nữa, tôi hy vọng có một cách khác nữa. – hyim

Các vấn đề liên quan