从嵌套字典创建 Spark DataFrame

8

我有一个嵌套字典的列表,例如 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()对象,希望数据框架可以推断模式,但当字典具有不同的模式时(例如第一个缺少某些键),它并没有起作用。
还有其他方法吗?谢谢!
1个回答

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)

我想避免那种情况(请参见我的问题)。我希望有一种方法可以在不必从字典创建RDD的情况下获取其模式。 - Marigold
2
很抱歉错过了您的中间段落。不幸的是,“从字典推断模式”的功能现在已经被弃用了,我希望还有其他方法。 - hyim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接