2015-04-21 5 views
6

Ho una lista di dizionari nidificati, ad es. ds = [{'a': {'b': {'c': 1}}}] e si desidera creare una scintilla DataFrame da esso mentre inferendo schema di dizionari nidificati. Utilizzando sqlContext.createDataFrame(ds).printSchema() mi da seguente schemaCreare Spark DataFrame dal dizionario nidificato

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

ma quello che mi serve è questo

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

Il secondo schema può essere creato convertendo prima dizionari a JSON e poi caricarlo con jsonRDD come questo sqlContext.jsonRDD(sc.parallelize([json.dumps(ds[0])])).printSchema(). Ma questo sarebbe abbastanza ingombrante per file di grandi dimensioni.

Ho pensato di convertire i dizionari in oggetti pyspark.sql.Row() sperando che il dataframe inferire lo schema, ma non ha funzionato quando i dizionari avevano schemi diversi (ad esempio prima mancava qualche chiave).

C'è un altro modo per farlo? Grazie!

risposta

2

Penso che questo aiuterà.

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

Poi,

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

volevo evitare che (vedi la mia domanda). Speravo ci fosse un modo per farlo senza dover creare RDD dai dizionari solo per ottenere il suo schema. – Marigold

+1

Ci scusiamo per la mancanza del tuo paragrafo intermedio. Purtroppo, la funzione "deduci schema dal dizionario" ora è deprecata, spero che ci sia un altro modo. – hyim