2015-04-21 7 views
6

İç içe geçmiş sözlüklerin bir örneğim var, ör. ds = [{'a': {'b': {'c': 1}}}] ve iç içe sözlüklerçıkarım şemasında bir kıvılcım DataFrame oluşturmak istiyorum. sqlContext.createDataFrame(ds).printSchema() kullanma şemaİç içe sözlükten Spark DataFrame oluşturma

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

aşağıdaki verir bana ama ne gerekir bu

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

ikinci şema öncelikle bu sqlContext.jsonRDD(sc.parallelize([json.dumps(ds[0])])).printSchema() gibi jsonRDD ile yüklemeye sonra JSON sözlükleri dönüştürerek ve oluşturulabilir olduğunu. Ama bu büyük dosyalar için oldukça hantal olurdu.

Sözlüklerin dönüştürüleceğini düşündüğümüz sözlükler pyspark.sql.Row() nesnelerini şemayı çıkaracak, ancak sözlükler farklı şemalar (örneğin, ilk önce bazı anahtar eksik) olduğunda işe yaramadı.

Bunu yapmak için başka bir yolu var mı? Teşekkürler!

cevap

2

Bunun yardımcı olacağını düşünüyorum. Sonra

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

,

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

(benim soruya bakın) kaçmak istedim. Sadece şemalarını almak için sözlüklerden RDD oluşturmaya gerek kalmadan bunu yapmanın bir yolu olduğunu umuyordum. – Marigold

+1

Ortadaki paragrafı kaçırdığım için üzgünüm.Ne yazık ki, 'sözlükten şema çıkar' özelliği artık kullanılmıyorsa, umarım başka bir yol da vardır. – hyim