【问题标题】:Converting dataframe to dictionary in pyspark without using pandas在不使用熊猫的情况下将数据框转换为pyspark中的字典
【发布时间】: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'),指的是这个问题中的数据框:stackoverflow.com/questions/65707148/…

标签: pandas apache-spark dictionary pyspark apache-spark-sql


【解决方案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 我删除了那个烦人的功能,你能再试一次吗?
猜你喜欢
  • 2019-07-18
  • 2018-07-14
  • 2019-05-07
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 2017-12-12
相关资源
最近更新 更多