【问题标题】:Dask how to open json with list of dictsDask 如何使用字典列表打开 json
【发布时间】:2021-03-29 00:36:48
【问题描述】:

我正在尝试使用 read_json 打开一堆 JSON 文件,以获取如下数据框

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"
    }
]

据我了解,问题在于我正在传递一个 dicts 列表,因此我正在寻找正确的方法来将其指定为 meta= 参数


警察局:

我也尝试过以下方式

{
    "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"]

【问题讨论】:

  • 你的_meta是什么?
  • 对不起,我忘记了,这是一个空的熊猫数据框,我将它添加到问题的描述中。感谢您的关注!

标签: json python-3.x pandas dask


【解决方案1】:

您想要的调用如下:

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

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

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

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

【讨论】:

  • 有效!!非常感谢!:D 我不明白 orient="records" 选项。我现在更清楚了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2021-12-06
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多