在不使用熊猫的情况下将数据框转换为pyspark中的字典

Posted

技术标签:

【中文标题】在不使用熊猫的情况下将数据框转换为pyspark中的字典【英文标题】:Converting dataframe to dictionary in pyspark without using pandas 【发布时间】:2021-01-14 11:12:06 【问题描述】:

跟进this 问题和数据框,我正在尝试将数据框转换为字典。在熊猫中我使用的是这个:

dictionary = df_2.unstack().to_dict(orient='index')

但是,我需要将此代码转换为 pyspark。谁能帮我这个?正如我从之前的问题(例如this)中了解到的,我确实需要使用熊猫,但是数据框太大了,我无法做到这一点。我该如何解决这个问题?

编辑:

我现在尝试了以下方法:

dictionary_list = map(lambda row: row.asDict(), df_2.collect())
dictionary  = age['age']: age for age in dictionary_list

(reference) 但它没有产生应有的效果。

在熊猫中,我得到的是以下内容:

【问题讨论】:

你的预期输出是什么? @mck 我在问题中添加了一个打印屏幕 @mck 我在 pandas 中的整个过程的原始代码是这样的:dictionary = (value/value.groupby(level=0).sum()).unstack().to_dict(orient ='index'),指的是这个问题中的数据框:***.com/questions/65707148/… 【参考方案1】:

df2 是上一篇文章中的数据框。您可以先进行数据透视,然后按照链接帖子中的说明转换为字典。

import pyspark.sql.functions as F

df3 = df2.groupBy('age').pivot('siblings').agg(F.first('count'))
list_persons = [row.asDict() for row in df3.collect()]
dict_persons = person['age']: person for person in list_persons

15: 'age': 15, '0': 1.0, '1': None, '3': None, 10: 'age': 10, '0': None, '1': None, '3': 1.0, 14: 'age': 14, '0': None, '1': 1.0, '3': None

或者其他方式:

df4 = df3.fillna(float('nan')).groupBy().pivot('age').agg(F.first(F.struct(*df3.columns[1:])))
result_dict = eval(df4.select(F.to_json(F.struct(*df4.columns))).head()[0])

'10': '0': 'NaN', '1': 'NaN', '3': 1.0, '14': '0': 'NaN', '1': 1.0, '3': 'NaN', '15': '0': 1.0, '1': 'NaN', '3': 'NaN'

【讨论】:

不幸的是它不起作用 :( "TypeError: 'map' object is not callable" 我正在使用编辑后的版本,不幸的是错误仍然存​​在 :( @Johanna 我删除了那个烦人的功能,你能再试一次吗?

以上是关于在不使用熊猫的情况下将数据框转换为pyspark中的字典的主要内容,如果未能解决你的问题,请参考以下文章

在不加载到内存的情况下将 HDF5 转换为 Parquet

如何在不丢失小数的情况下将数据框中的字符转换为数字

如何在不转换为火花数据集的情况下遍历数据框?

PySpark DataFrames - 在不转换为 Pandas 的情况下进行枚举的方法?

PySpark DataFrames - 在不转换为 Pandas 的情况下进行枚举的方法?

如何在不使用数据框的情况下将一行分解为多行?