Python 将pyspark.sql.dataframe.dataframe类型dataframe转换为字典

Python 将pyspark.sql.dataframe.dataframe类型dataframe转换为字典,python,dictionary,apache-spark,pyspark,Python,Dictionary,Apache Spark,Pyspark,我有一个pyspark数据帧,需要将其转换为python字典 以下代码是可复制的: from pyspark.sql import Row rdd = sc.parallelize([Row(name='Alice', age=5, height=80),Row(name='Alice', age=5, height=80),Row(name='Alice', age=10, height=80)]) df = rdd.toDF() 一旦我有了这个数据帧,我需要将它转换成字典 我试过这样做 d

我有一个pyspark数据帧,需要将其转换为python字典

以下代码是可复制的:

from pyspark.sql import Row
rdd = sc.parallelize([Row(name='Alice', age=5, height=80),Row(name='Alice', age=5, height=80),Row(name='Alice', age=10, height=80)])
df = rdd.toDF()
一旦我有了这个数据帧,我需要将它转换成字典

我试过这样做

df.set_index('name').to_dict()

但它给出了错误。如何实现这一点

您需要首先使用
toPandas()
转换为
pandas.DataFrame
,然后您可以使用
to_dict()
方法在转置的数据框上使用
orient='list'

df.toPandas().set_index('name').T.to_dict('list')
# Out[1]: {u'Alice': [10, 80]}

请参见下面的示例:

>>> from pyspark.sql.functions import col
>>> df = (sc.textFile('data.txt')
            .map(lambda line: line.split(","))
            .toDF(['name','age','height'])
            .select(col('name'), col('age').cast('int'), col('height').cast('int')))

+-----+---+------+
| name|age|height|
+-----+---+------+
|Alice|  5|    80|
|  Bob|  5|    80|
|Alice| 10|    80|
+-----+---+------+

>>> list_persons = map(lambda row: row.asDict(), df.collect())
>>> list_persons
[
    {'age': 5, 'name': u'Alice', 'height': 80}, 
    {'age': 5, 'name': u'Bob', 'height': 80}, 
    {'age': 10, 'name': u'Alice', 'height': 80}
]

>>> dict_persons = {person['name']: person for person in list_persons}
>>> dict_persons
{u'Bob': {'age': 5, 'name': u'Bob', 'height': 80}, u'Alice': {'age': 10, 'name': u'Alice', 'height': 80}}
我用来测试
data.txt
的输入:

Alice,5,80
Bob,5,80
Alice,10,80
首先,我们使用pyspark读取行来进行加载。然后我们通过在逗号上拆分将行转换为列。然后,我们将本机RDD转换为DF,并将名称添加到列中。最后,我们将列转换为适当的格式

然后,我们将所有内容收集到驱动程序中,并使用一些python列表理解将数据转换为首选的表单。我们使用
asDict()
方法将
对象转换为字典。在输出中,我们可以看到Alice只出现一次,但这当然是因为Alice的键被覆盖了

请记住,在将结果返回给驱动程序之前,您希望在PypPark中执行所有处理和过滤


希望这有帮助,干杯。

RDD内置了函数asDict(),可以将每一行表示为一个dict

如果您有一个数据帧df,那么您需要将其转换为rdd并应用asDict()

然后,可以使用新的rdd执行常规python映射操作,如:

# You can define normal python functions like below and plug them when needed
def transform(row):
    # Add a new key to each row
    row["new_key"] = "my_new_value"
    return row

new_rdd = new_rdd.map(lambda row: transform(row))

但是您的输出不正确,对吗?我想要这样的输出
{name:[age,height]}
所以输出应该是{Alice:[5,80]}没有'u',我不鼓励在这里使用Panda's。Panda’s是一个很大的依赖性,对于这样一个简单的操作来说是不需要的。这就是为什么你应该在你的问题中分享预期的结果,为什么年龄
5
而不是
10
?如果你想创建一本字典,你应该有唯一的记录。嗨,福克,名单的打印为我呈现了“”。有什么帮助吗?将列表环绕在地图上,即list_persons=list(地图(lambda行:row.asDict(),df.collect())
# You can define normal python functions like below and plug them when needed
def transform(row):
    # Add a new key to each row
    row["new_key"] = "my_new_value"
    return row

new_rdd = new_rdd.map(lambda row: transform(row))