从嵌套字典创建 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的主要内容,如果未能解决你的问题,请参考以下文章