es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo convertir parquet a json

Tengo archivos parquet alojados en S3 que quiero descargar y convertir a JSON. Anteriormente, pude utilizar selectobjectcontent para generar ciertos archivos como JSON usando SQL. Necesito encontrar una manera más rápida de hacerlo porque está agotando el tiempo para archivos más grandes.

He intentado lo siguiente:

df = pd.read_parquet(s3_location)
df = df.to_json(orient="records")

Sin embargo, la salida JSON del código anterior incluye las rutas de clave (hotels.date.hotelprice EN LUGAR DE hotels:{date:{hotelprice: 100}}.

¿Alguien sabe cómo hacerlo para que salga como el segundo tipo de JSON?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr el formato JSON deseado es utilizar la biblioteca fastparquet en Python, que está diseñada para el procesamiento eficiente y escalable de archivos Parquet. Aquí tienes un ejemplo:

    import fastparquet as fp
    import io
    
    # Leer el archivo Parquet de S3 en memoria como un DataFrame de pandas
    with fp.ParquetFile(s3_location) as pf:
        df = pf.to_pandas()
    
    # Convertir DataFrame a JSON aplicando una función personalizada a cada fila
    def row_to_json(row):
        json_dict = {}
        for column, value in row.items():
            keys = column.split('.')
            current_dict = json_dict
            for key in keys[:-1]:
                current_dict = current_dict.setdefault(key, {})
            current_dict[keys[-1]] = value
        return json_dict
    
    json_list = [row_to_json(row) for _, row in df.iterrows()]
    json_output = io.StringIO()
    for json_dict in json_list:
        json_output.write(json.dumps(json_dict) + '\n')
    
    # Exportar JSON a un archivo, subir a S3 o devolver como cadena de texto
    output_string = json_output.getvalue()
    

    La función row_to_json construye de forma recursiva un diccionario anidado a partir de cada fila del DataFrame, donde las claves se derivan de los nombres de las columnas (divididas por “.”). Esto nos permite producir el formato JSON deseado, donde los valores son objetos anidados en lugar de rutas de claves planas. El objeto StringIO json_output se utiliza para recolectar las cadenas JSON individuales en una salida delimitada por saltos de línea, que luego se puede escribir en un archivo o subir a S3 según sea necesario. Hay que tener en cuenta que este enfoque utiliza más memoria que el método pd.read_parquet, ya que cargamos todo el DataFrame en memoria de una sola vez, pero debería ser mucho más rápido y escalable para conjuntos de datos más grandes.

Comments are closed.