从嵌套字典创建 Spark DataFrame

Posted

技术标签:

【中文标题】从嵌套字典创建 Spark DataFrame【英文标题】:Create Spark DataFrame from nested dictionary 【发布时间】:2015-04-21 11:14:49 【问题描述】:

我有一个嵌套字典列表,例如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)

但我需要的是这个

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() 对象,希望数据框能够推断架构,但是当字典具有不同的架构时(例如 first 缺少一些键),它就不起作用了。

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

【问题讨论】:

【参考方案1】:

我认为这会有所帮助。

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)

【讨论】:

我想避免这种情况(见我的问题)。我希望有一种方法可以做到这一点,而不必从字典中创建 RDD 来获取它的模式。 很抱歉错过了中间段落。不幸的是,“从字典中推断模式”功能现在已弃用,我希望还有另一种方法。

以上是关于从嵌套字典创建 Spark DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

从嵌套字典创建单个字典以更新 MySQLdb

如何从 2 个 pkl 文件创建 Python 嵌套字典/将 2 个嵌套字典合并为一个?

Python:从父子值列表创建嵌套字典

从熊猫数据框创建嵌套字典

如何使用熊猫从嵌套字典创建数据框?

如何从嵌套字典创建多索引数据框?