Dask cómo abrir json con lista de dicts

Estoy tratando de abrir un montón de archivos JSON usando read_json Para obtener un Dataframe como sigue

ddf.compute()

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

pero estoy recibiendo el siguiente error

_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`.

Mis archivos JSON parecen

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

Por lo que entiendo el problema es que estoy pasando una lista de dicts, así que estoy buscando la manera correcta de especificarlo meta= argumentación


PD:

También intenté hacerlo de la siguiente manera

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

Pero Dask interpreta erróneamente los datos

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

Pregunta hecha hace 3 años, 4 meses, 27 días - Por debugdragon


3 Respuestas:

  • La invocación que desea es la siguiente:

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

    que se puede recoger en gran parte de la cadena.

    • meta se ve bien desde tu código
    • blockize debe ser Ninguno, ya que tiene un objeto JSON entero por archivo y no puede dividir el archivo
    • orient "records" significa lista de objetos
    • líneas=False significa que esto es no un archivo JSON delimitado por línea, que es el caso más común para Dask (no estás suponiendo que un personaje de nueva línea significa un nuevo registro)

    ¿Entonces por qué el error? Probablemente Dask dividió su archivo en algún personaje de nueva línea, y así un registro parcial se paró, que por lo tanto no coincidió con su meta dada.

    Respondida el Dec 18, 2020 a las 10:54 - por markupmaestro

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás recibiendo se debe a que estás pasando una lista de diccionarios como datos de ejemplo (meta) en lugar de un solo diccionario que represente la estructura de los datos que esperas en tus archivos JSON.

    Para solucionar este problema, puedes definir un diccionario que refleje la estructura de tus datos y pasarlo como argumento meta al momento de leer los archivos JSON. Aquí te muestro cómo puedes hacerlo:

    python
    import pandas as pd
    import dask.dataframe as dd
    
    

    Definir la estructura de los datos esperados en el JSON

    meta = { "id": int, "owner": str, "pet_id": str }

    Leer los archivos JSON con la estructura definida en 'meta'

    ddf = dd.read_json("mypets/*.json", meta=meta) df = ddf.compute() print(df)

    Al definir meta como un diccionario simple con los nombres de las columnas y los tipos de datos, Dask será capaz de interpretar correctamente la estructura de los datos en los archivos JSON y crear el DataFrame adecuado.

    Espero que esta solución te ayude a leer tus archivos JSON con lista de diccionarios correctamente en Dask. Si tienes alguna otra pregunta, ¡no dudes en hacerla!

    Respondida el Dec 19, 2020 a las 10:54 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás recibiendo es causado por un desajuste entre los metadatos proporcionados y los datos reales de tus archivos JSON. Específicamente, Dask espera que los datos sean un único objeto JSON con una lista de diccionarios, pero tus archivos JSON contienen listas de diccionarios.

    Para resolver este problema, puedes utilizar la función dd.from_pandas para crear un DataFrame distribuido a partir de una lista de diccionarios. Aquí tienes un ejemplo modificado de tu código:

    python
    import dask.dataframe as dd
    import pandas as pd
    
    

    Crea una lista de diccionarios a partir de tus archivos JSON

    dict_list = [] for filename in ["mypets/*.json"]: with open(filename) as f: data = json.load(f) dict_list.extend(data)

    Crea un DataFrame de Pandas a partir de la lista de diccionarios

    df = pd.DataFrame(dict_list)

    Crea un DataFrame distribuido a partir del DataFrame de Pandas

    ddf = dd.from_pandas(df, npartitions=2)

    Calcula el resultado

    result = ddf.compute() print(result)

    Este código creará un DataFrame distribuido a partir de la lista de diccionarios y lo calculará para obtener el resultado.

    Respondida el Dec 19, 2020 a las 10:58 - por Gemini

    Votos positivos: 0 | Votos negativos: 0