如何在PySpark中将字典转换为数据框?

8
我试图将一个字典:data_dict = {'t1': '1', 't2': '2', 't3': '3'} 转换成一个数据框:
key   |   value|
----------------
t1          1
t2          2
t3          3

为了实现这个目标,我尝试了以下方法:
schema = StructType([StructField("key", StringType(), True), StructField("value", StringType(), True)])
ddf = spark.createDataFrame(data_dict, schema)

但是我遇到了以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/apache-spark/2.4.5/libexec/python/pyspark/sql/session.py", line 748, in createDataFrame
    rdd, schema = self._createFromLocal(map(prepare, data), schema)
  File "/usr/local/Cellar/apache-spark/2.4.5/libexec/python/pyspark/sql/session.py", line 413, in _createFromLocal
    data = list(data)
  File "/usr/local/Cellar/apache-spark/2.4.5/libexec/python/pyspark/sql/session.py", line 730, in prepare
    verify_func(obj)
  File "/usr/local/Cellar/apache-spark/2.4.5/libexec/python/pyspark/sql/types.py", line 1389, in verify
    verify_value(obj)
  File "/usr/local/Cellar/apache-spark/2.4.5/libexec/python/pyspark/sql/types.py", line 1377, in verify_struct
    % (obj, type(obj))))
TypeError: StructType can not accept object 't1' in type <class 'str'>

我尝试了不指定模式,只指定列数据类型的方式:

ddf = spark.createDataFrame(data_dict, StringType())
ddf = spark.createDataFrame(data_dict, StringType(), StringType())

但是两种方法都会得到下面只包含字典键值的一个列的数据框:

+-----+
|value|
+-----+
|t1   |
|t2   |
|t3   |
+-----+

有人可以告诉我如何在PySpark中将字典转换为Spark DataFrame吗?
3个回答

9
你可以使用 data_dict.items() 来列出键/值对:
spark.createDataFrame(data_dict.items()).show()

打印哪个

+---+---+
| _1| _2|
+---+---+
| t1|  1|
| t2|  2|
| t3|  3|
+---+---+

当然,你可以指定你的模式:

spark.createDataFrame(data_dict.items(), 
                      schema=StructType(fields=[
                          StructField("key", StringType()), 
                          StructField("value", StringType())])).show()

导致

+---+-----+
|key|value|
+---+-----+
| t1|    1|
| t2|    2|
| t3|    3|
+---+-----+

1
假设字典的值是列表,例如:data_dict = {'t1': [1, 5], 't2': [4, 7], 't3': [8, 9]},我该如何创建一个DataFrame,使其不仅有一个列显示列表的值,而是有两列分别显示列表的值:+---+-----+-----+ |key|value1|value2| +---+-----+-----+ | t1| 1| 5| | t2| 4| 7| | t3| 8| 9| +---+-----+-----+ - Lucho
@Lucho,虽然晚了一年,但我遇到了同样的问题,我在我的答案中添加了我找到的解决方案。 - Axeltherabbit

0

我只想补充一点,如果你有一个字典,其中包含键值对col: list[vals]

例如:

{
 "col1" : [1,2,3],
 "col2" : ["a", "b", "c"]
}

一个可能的解决方案是:
columns = list(raw_data.keys())
data = [[*vals] for vals in zip(*raw_data.values())]
df = spark.createDataFrame(data, columns)

但我对pyspark还很陌生,也许有更好的方法来做到这一点?


0

你可以做一个字典列表,就像这样:

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()

df = spark.createDataFrame([
                        {"deptId": 1, "age": 40},
                        {"deptId": 2, "age" 50},
                       ])
df.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接