从 pyspark 中的字典列创建数据框

Posted

技术标签:

【中文标题】从 pyspark 中的字典列创建数据框【英文标题】:Create a dataframe from column of dictionaries in pyspark 【发布时间】:2018-11-09 04:25:20 【问题描述】:

我想从 pyspark 中的现有数据框创建一个新的数据框。数据框“df”包含一个名为“data”的列,该列具有字典行并具有作为字符串的模式。并且每个字典的键是不固定的。例如,名称和地址是第一行字典的键,但对于其他行则不是这样,它们可能不同。以下是该示例;

........................................................
  data 
........................................................
 "name": "sam", "address":"uk"
........................................................
"name":"jack" , "address":"aus", "occupation":"job"
.........................................................

如何转换成具有如下各列的数据框。

 name   address    occupation
 sam       uk       
 jack      aus       job

【问题讨论】:

How to convert list of dictionaries into Spark DataFrame的可能重复 或者Pyspark: explode json in column to multiple columns的骗子。从你的问题很难判断 @pault 这两个链接都不重复。我在询问之前提到了它。这个问题是正确理解的。数据框“df”有一个名为“data”的列,其中包含字典行。它不是字典列表。 你的问题还不清楚。您不能在 pyspark DataFrame 中有“字典行”。 df 是熊猫数据框吗?或者data 列实际上是StringType()MapType() 类型的? Edit 你的问题与df.select('data').printSchema() 的输出。更好的是,提供reproducible example。也许你正在寻找this answer。 【参考方案1】:

data转换为RDD,然后使用spark.read.json将RDD转换为带有schema的dataFrame。

data = [
    "name": "sam", "address":"uk", 
    "name":"jack" , "address":"aus", "occupation":"job"
]

spark = SparkSession.builder.getOrCreate()
df = spark.read.json(sc.parallelize(data)).na.fill('') 
df.show()
+-------+----+----------+
|address|name|occupation|
+-------+----+----------+
|     uk| sam|          |
|    aus|jack|       job|
+-------+----+----------+

【讨论】:

我已经尝试过这种方法,它给出 py4j.Py4JException: Method __getnewargs__([]) 不存在。数据是数据框df的列名。【参考方案2】:

如果行的顺序不重要,这是另一种方法:

from pyspark import SparkContext
sc = SparkContext()

df = sc.parallelize([
    "name":"jack" , "address":"aus", "occupation":"job",
    "name": "sam", "address":"uk"     
 ]).toDF()

df = df.na.fill('')

df.show()

+-------+----+----------+
|address|name|occupation|
+-------+----+----------+
|    aus|jack|       job|
|     uk| sam|          |
+-------+----+----------+

【讨论】:

以上是关于从 pyspark 中的字典列创建数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PySpark 中的多个列创建字典列表,其中键是列名,值是该列的值?

pyspark 从 pyspark sql 数据框创建字典数据

将列字典从不同的数据帧转换为数据帧:pyspark

如何按列对pyspark中的数据框进行分组并以该列作为键并以记录列表作为其值来获取字典?

从 pyspark 数据框创建 multidict

PySpark - 如何根据列中的两个值从数据框中过滤出连续的行块