2015-04-21 3 views
6

У меня есть список вложенных словарей, например. ds = [{'a': {'b': {'c': 1}}}] и хотите создать из него искра DataFrame, а вывести схему вложенных словарей. Использование sqlContext.createDataFrame(ds).printSchema() дает мне следующую схемуСоздать Spark DataFrame из вложенного словаря

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

но то, что мне нужно это

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

Вторая схема может быть создана первым преобразованием словарей в формат JSON, а затем загрузить его с jsonRDD как этим sqlContext.jsonRDD(sc.parallelize([json.dumps(ds[0])])).printSchema(). Но это было бы довольно громоздко для больших файлов.

Я думал о преобразовании словарей в объекты pyspark.sql.Row(), надеясь, что dataframe выведет схему, но это не сработало, когда словари имели разные схемы (например, вначале отсутствовал какой-то ключ).

Есть ли другой способ сделать это? Благодаря!

ответ

2

Я думаю, что это поможет.

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

Я хотел избежать этого (см мой вопрос). Я надеялся, что есть способ сделать это, не создавая RDD из словарей, чтобы получить его схему. – Marigold

+1

Прошу прощения за ваш средний абзац. К сожалению, теперь функция «выводить схему из словаря» не рекомендуется, я надеюсь, что есть и другой способ. – hyim

Смежные вопросы