首页 > 解决方案 > 使用 Koalas 将 dict 列表转换为 DataFrame

问题描述

我试图将 dicts 列表转换为 Databricks 的 Koalas DataFrame,但我不断收到错误消息:

ArrowInvalid:不能混合列表和非列表、非空值

Pandas 完美运行(使用 pd.DataFrame(list)),但由于公司限制,我必须使用 PySpark/Koalas。我还尝试将列表转换为字典,但错误仍然存​​在。

列表示例:

[{'A': None,
  'B': None,
  'C': None,
  'D': None,
  'E': [],
  ...},
{'A': data,
  'B': data,
  'C': data,
  'D': data,
  'E': None,
  ...}
]

字典就像:

{'A': [None,  data,  [],  [],  data],
'B': [None, data, None, [], None],
'C': [None, data, None, [], None],
'D': [None, data, None, [], None],
'E': [[], None, data, [], None]}

是否可以从中获取 DataFrame ?谢谢

标签: pythonpandasdataframepysparkspark-koalas

解决方案


您可以使用您的数据创建一个 Spark DataFrame,而无需使用spark.createDataFrame().

sdf = spark.createDataFrame(
    data_list,
    T.StructType([
        T.StructField('A', T.ArrayType(T.IntegerType()), True),
        T.StructField('B', T.ArrayType(T.IntegerType()), True),
        T.StructField('C', T.ArrayType(T.IntegerType()), True),
        T.StructField('D', T.ArrayType(T.IntegerType()), True),
        T.StructField('E', T.ArrayType(T.IntegerType()), True),
    ])
)

然后可以使用to_koalas().

>>> sdf.to_koalas()
           A          B          C          D     E
0       None       None       None       None    []

1  [1, 2, 3]  [1, 2, 3]  [1, 2, 3]  [1, 2, 3]  None

此外,通过修改您的数据,使空列表[]的值改为None.

data_list = [
        {
            'A': None,
            'B': None,
            'C': None,
            'D': None,
            'E': None,
        },
        {
            'A': [1, 2, 3],
            'B': [1, 2, 3],
            'C': [1, 2, 3],
            'D': [1, 2, 3],
            'E': None,
        }
]
>>> import databricks.koalas as ks
>>> ks.DataFrame(data_list)
           A          B          C          D     E
0       None       None       None       None  None
1  [1, 2, 3]  [1, 2, 3]  [1, 2, 3]  [1, 2, 3]  None

推荐阅读