从嵌套字典创建Spark DataFrame

Mar*_*old 7 apache-spark pyspark

我有一个嵌套字典列表,例如,ds = [{'a': {'b': {'c': 1}}}]并希望在推断嵌套字典的架构时从中创建一个Spark DataFrame .使用sqlContext.createDataFrame(ds).printSchema()给我以下架构

root
 |-- a: map (nullable = true)
 |    |-- key: string
 |    |-- value: map (valueContainsNull = true)
 |    |    |-- key: string
 |    |    |-- value: long (valueContainsNull = true)
Run Code Online (Sandbox Code Playgroud)

但我需要的是这个

root
 |-- a: struct (nullable = true)
 |    |-- b: struct (nullable = true)
 |    |    |-- c: long (nullable = true)
Run Code Online (Sandbox Code Playgroud)

可以通过首先将字典转换为JSON然后jsonRDD像这样加载它来创建第二个模式sqlContext.jsonRDD(sc.parallelize([json.dumps(ds[0])])).printSchema().但是对于大文件来说这会非常麻烦.

我考虑过将字典转换为pyspark.sql.Row()希望数据框推断模式的对象,但是当字典有不同的模式时(例如,首先缺少某些键),它不起作用.

有没有其他方法可以做到这一点?谢谢!

hyi*_*yim 2

我认为这会有所帮助。

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

然后,

root
|-- a: struct (nullable = true)
|    |-- b: struct (nullable = true)
|    |    |-- c: long (nullable = true)
Run Code Online (Sandbox Code Playgroud)

  • 很抱歉错过了中间段落。不幸的是,“从字典推断模式”功能现在已弃用,我希望还有另一种方法。 (2认同)