来自Python Dictionary的PySpark Dataframe没有Pandas

Ang*_*Sen 4 pyspark pyspark-sql

我试图将以下Python dict转换为PySpark DataFrame,但我没有获得预期的输出.

dict_lst = {'letters': ['a', 'b', 'c'], 
             'numbers': [10, 20, 30]}
df_dict = sc.parallelize([dict_lst]).toDF()  # Result not as expected
df_dict.show()
Run Code Online (Sandbox Code Playgroud)

有没有办法在不使用熊猫的情况下做到这一点?

pau*_*ult 6

引用自己:

我发现将createDataFrame()的参数视为元组列表是有用的,其中列表中的每个条目对应于DataFrame中的一行,并且元组的每个元素对应一列.

所以最简单的方法是将字典转换为这种格式.你可以使用zip()以下方法轻松完成:

column_names, data = zip(*dict_lst.items())
spark.createDataFrame(zip(*data), column_names).show()
#+-------+-------+
#|letters|numbers|
#+-------+-------+
#|      a|     10|
#|      b|     20|
#|      c|     30|
#+-------+-------+
Run Code Online (Sandbox Code Playgroud)

以上假设所有列表的长度相同.如果不是这种情况,则必须使用itertools.izip_longest(python2)或itertools.zip_longest(python3).

from itertools import izip_longest as zip_longest # use this for python2
#from itertools import zip_longest # use this for python3

dict_lst = {'letters': ['a', 'b', 'c'], 
             'numbers': [10, 20, 30, 40]}

column_names, data = zip(*dict_lst.items())

spark.createDataFrame(zip_longest(*data), column_names).show()
#+-------+-------+
#|letters|numbers|
#+-------+-------+
#|      a|     10|
#|      b|     20|
#|      c|     30|
#|   null|     40|
#+-------+-------+
Run Code Online (Sandbox Code Playgroud)