【问题标题】:How to create a dataframe in pyspark from a dictionary which have different value size?如何从具有不同值大小的字典在 pyspark 中创建数据框?
【发布时间】:2020-08-16 09:30:39
【问题描述】:

假设我们有一个这样的python字典:

dict = {"person1" : (20, 17, 157, 31, 35), "person2" : (29 , 11) , "person3" : (200, 100 , 11)}

如何根据这个字典在 pyspark 中创建一个 Dataframe,它有不同大小的字符串键和元组作为其值?

我想要的输出是这样的:

    key   |     value
-------------------------------------
 person1  |   (20, 17, 157, 31, 35)
 ------------------------------------  
 person2  |       (29 , 11)
-------------------------------------
 person3  |     (200, 100 , 11)

我试图用这段代码做到这一点:

df = pd.DataFrame(dict)
ddf = spark.createDataFrame(df)

但它会引发这样的值错误:

ValueError: 数组的长度必须相同

谁能给我建议?

【问题讨论】:

  • 您预期的输出数据帧是什么?
  • @Shu 我编辑了我的答案并显示了我的预期输出。

标签: python dataframe dictionary pyspark


【解决方案1】:

试试 from_dict + orient 然后转置df

dict = {"person1" : (20, 17, 157, 31, 35), "person2" : (29 , 11) , "person3" : (200, 100 , 11)}
df = pd.DataFrame.from_dict(dict, orient='index').transpose()

#creating spark dataframe
sp_df = spark.createDataFrame(df).fillna({'person2':'','person3':''})

#cast all columns to int
ddf=sp_df.select([col(c).cast("int") for c in sp_df.columns])
ddf.show()
#+-------+-------+-------+
#|person1|person2|person3|
#+-------+-------+-------+
#|     20|     29|    200|
#|     17|     11|    100|
#|    157|   null|     11|
#|     31|   null|   null|
#|     35|   null|   null|
#+-------+-------+-------+

UPDATE:

dict = {"person1" : (20, 17, 157, 31, 35), "person2" : (29 , 11) , "person3" : (200, 100 , 11)}
df = pd.DataFrame.from_dict(dict, orient='index').fillna('').astype(str).transpose()

sp_df = spark.createDataFrame(df)
ddf=sp_df.select([col(c).cast("int") for c in sp_df.columns])
ddf.show()
#+-------+-------+-------+
#|person1|person2|person3|
#+-------+-------+-------+
#|     20|     29|    200|
#|     17|     11|    100|
#|    157|   null|     11|
#|     31|   null|   null|
#|     35|   null|   null|
#+-------+-------+-------+

【讨论】:

  • 谢谢,但这是一个例子,我的字典有很多键值对,我无法手动创建 Dataframe。所以不可能用这个指令创建: sp_df = spark.createDataFrame(df).fillna({'person2':'','person3':''})
  • 谢谢你。现在可以了。但是由于我的字典非常大,由于长度不同而产生了很多空值。没关系,但你知道另一种生成我想要的第二个输出的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 2023-02-05
  • 1970-01-01
  • 2013-11-13
相关资源
最近更新 更多