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.

Leer archivo Parquet desde AWS S3 en Rust

Estoy tratando de leer archivos parquet desde S3. Esto es lo que tengo hasta ahora,

use std::fs::File;
use std::path::Path;
use parquet::file::reader::{FileReader, SerializedFileReader};
use parquet::record::RowAccessor;

pub fn read_file() {

let response = s3<em>cliente.obtener</em>objeto(); // Se excluyen las propiedades de conexión aquí, pero se entiende el punto.
 let stream = response.body.unwrap();
 let content = stream.concat2().wait().unwrap();
 let mut file = File::create("./mappings.pq").expect("error al crear");
 file.write_all(&content).expect("error al escribir el cuerpo");
}

pub fn process() {

let file = File::open(&Path::new("./mappings.pq")).unwrap(); 
let reader = SerializedFileReader::new(file).unwrap(); 

// usar reader para obtener metadatos
// usar reader para procesar registros

}

  1. ¿Existe una forma mejor que descargar el archivo y almacenarlo en el sistema de archivos? Idealmente, me gustaría usar un iterador de flujo para leer el archivo.
  2. Según la documentación de la biblioteca parquet, SerializedFileReader es el punto de entrada para procesar archivos parquet. Parece trabajar solo con objetos de archivo. ¿Existe una alternativa a esto? ¿Una implementación que admita la lectura desde flujos?
Tags:  , ,

Answer

  1. Avatar for davy.ai
    1. Sí, hay una forma mejor de leer archivos Parquet desde S3 sin descargarlos y almacenar el archivo en el sistema de archivos local. Puede utilizar la biblioteca aws-sdk-rust para obtener un flujo del objeto S3 y pasarlo directamente al SerializedFileReader sin escribirlo en un archivo. Aquí tienes un ejemplo de código:
    use rusoto_core::Region;
    use rusoto_s3::{GetObjectRequest, S3Client, S3};
    use parquet::file::reader::{FileReader, SerializedFileReader};
    use parquet::record::RowAccessor;
    
    pub async fn read_file() {
        let s3_client = S3Client::new(Region::default());
        let get_req = GetObjectRequest {
                bucket: "tu_bucket".to_owned(),
                key: "tu_archivo.parquet".to_owned(),
                ..Default::default()
        };
        let result = s3_client.get_object(get_req).await.unwrap();
        let body = result.body.unwrap();
        let reader = SerializedFileReader::new(body.into_blocking_read()).unwrap();
        // utilizar el lector para obtener metadatos
        // utilizar el lector para procesar registros
    }
    
    1. La biblioteca parquet no admite la lectura directa desde flujos, pero como se mencionó anteriormente, puedes utilizar la biblioteca aws-sdk-rust para obtener un flujo del objeto S3 y pasarlo directamente al SerializedFileReader.

Comments are closed.