首页 > 解决方案 > Dask 如何使用字典列表打开 json

问题描述

我正在尝试使用以下方法打开一堆 JSON 文件read_json以获取 Dataframe

ddf.compute()

    id      owner        pet_id
0   1       "Charlie"    "pet_1"
1   2       "Charlie"    "pet_2"
3   4       "Buddy"      "pet_3"

但我收到以下错误

_meta = pd.DataFrame(
    columns=list(["id", "owner", "pet_id"]])
    ).astype({
        "id":int, 
        "owner":"object", 
        "pet_id": "object"
    })
ddf = dd.read_json(f"mypets/*.json", meta=_meta)
ddf.compute()

*** ValueError: Metadata mismatch found in `from_delayed`.

我的 JSON 文件看起来像

[
    {
        "id": 1, 
        "owner": "Charlie", 
        "pet_id": "pet_1"
    }, 
    {
        "id": 2, 
        "owner": "Charlie",
        "pet_id": "pet_2"
    }
]

据我了解,问题是我正在传递一个字典列表,所以我正在寻找正确的方法来指定它的meta=参数


PD:

我也尝试过以下方式

{
    "id": [1, 2], 
    "owner": ["Charlie", "Charlie"], 
    "pet_id": ["pet_1", "pet_2"]
}

但是 Dask 错误地解释了数据

ddf.compute()
    id          owner                pet_id
0   [1, 2] ["Charlie", "Charlie"]   ["pet_1", "pet_2"]
1   [4]    ["Buddy"]                ["pet_3"]

标签: jsonpython-3.xpandasdask

解决方案


您想要的调用如下:

dd.read_json("data.json", meta=meta, 
    blocksize=None, orient="records", 
    lines=False)

这可以在很大程度上从文档字符串中收集到。

  • 从您的代码来看,meta 看起来不错
  • blocksize 必须为 None,因为每个文件都有一个完整的 JSON 对象并且不能拆分文件
  • orient "records" 表示对象列表
  • lines=False 表示这不是行分隔的 JSON 文件,这是 Dask 更常见的情况(您不假设换行符意味着新记录)

那么为什么会出错呢?可能 Dask 在某个换行符上拆分了您的文件,因此解析了部分记录,因此与您给定的元数据不匹配。


推荐阅读