在不使用熊猫的情况下将数据框转换为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中的字典的主要内容,如果未能解决你的问题,请参考以下文章
PySpark DataFrames - 在不转换为 Pandas 的情况下进行枚举的方法?