2015-04-21 18 views
6

Mam listę zagnieżdżonych słowników, np. ds = [{'a': {'b': {'c': 1}}}] i chcesz utworzyć iskrę DataFrame z niej, podczas gdy wnioskowanie schematu zagnieżdżonych słowników. Korzystanie sqlContext.createDataFrame(ds).printSchema() daje mi następującego schematuTworzenie elementu DataFrame Spark z zagnieżdżonego słownika

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

ale to, co jest mi potrzebne to

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

Drugi schemat może być utworzony przez pierwsze słowniki konwersji do formatu JSON, a następnie załadować go z jsonRDD jak ten sqlContext.jsonRDD(sc.parallelize([json.dumps(ds[0])])).printSchema(). Byłoby to jednak dość kłopotliwe w przypadku dużych plików.

Pomyślałem o konwersji słowników na pyspark.sql.Row() obiektów mających nadzieję, że ramka danych wywnioskuje schemat, ale nie działało, gdy słowniki mają różne schematy (np. Pierwszy brakowało jakiegoś klucza).

Czy jest jakiś inny sposób na zrobienie tego? Dzięki!

Odpowiedz

2

Myślę, że to pomoże.

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

Następnie

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

Chciałem tego uniknąć (patrz moje pytanie). Miałem nadzieję, że jest sposób na zrobienie tego bez konieczności tworzenia RDD ze słowników, aby uzyskać jego schemat. – Marigold

+1

Przepraszam za brak twojego środkowego akapitu. Niestety, funkcja "wnioskuj o schemacie ze słownika" teraz przestarzała, mam nadzieję, że jest inny sposób. – hyim

Powiązane problemy