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.

Lea el archivo Avro Parquet desde dentro del archivo JAR.

Estoy intentando leer un archivo Parquet incluido como recurso dentro de un JAR, preferiblemente como un flujo.

¿Alguien tiene un ejemplo que funcione y que no implique escribir primero el recurso como un archivo temporal?

Aquí está el código que estoy usando para leer los archivos, que funciona bien en el IDE antes de empaquetar como un JAR:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.parquet.avro.AvroParquetReader;

try {
    Path path = new Path(classLoader.getResource(pattern_id).toURI());

    Configuration conf = new Configuration();

    try (ParquetReader<genericrecord> r = AvroParquetReader.<genericrecord>builder(
            HadoopInputFile.fromPath(path, conf))
            .disableCompatibility()
            .build()) {
        patternsFound.add(pattern_id);

        GenericRecord record;
        while ((record = r.read()) != null) {
                // Hacer algo

        }


    } catch (IOException e) {
        e.printStackTrace();
    }
} catch (NullPointerException | URISyntaxException e) {

    e.printStackTrace();
}

Al ejecutar este código desde un archivo JAR, obtengo este error:

org.apache.hadoop.fs.UnsupportedFileSystemException: No FileSystem for scheme "jar"

Al parecer, puedo solucionar esto usando:

InputStream inputFile = classLoader.getResourceAsStream(pattern_id);

Pero no sé cómo hacer que AvroParquetReader funcione con flujos de entrada.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, AvroParquetReader no admite la lectura directa desde flujos de entrada. Una posible solución alternativa es leer el flujo de entrada en un archivo temporal y luego leer el archivo Parquet desde ese archivo temporal. Aquí hay un ejemplo de fragmento de código:

    “ `java
    InputStream inputStream = classLoader.getResourceAsStream (pattern_id);

    tratar {
    // Crear archivo temporal
    Archivo tempFile = File.createTempFile (“temp”, “.parquet”);
    tempFile.deleteOnExit ();

    // Escribir InputStream en archivo temporal
    Files.copy (inputStream, tempFile.toPath (), StandardCopyOption.REPLACE_EXISTING);

    // Leer archivo Parquet desde archivo temporal
    Configuración conf = nueva configuración ();
    ParquetReader reader = AvroParquetReader. builder (HadoopInputFile.fromPath (new Path(tempFile.getAbsolutePath()), conf)).build ();

    Registro genérico;
    while ((registro = lector.leer ())! = Null) {
    // Hacer algún trabajo
    }

    } catch (IOException e) {
    e.printStackTrace ();
    }
    “`

    Tenga en cuenta que este código crea un archivo temporal y lo elimina cuando el programa sale. Además, es posible que deba modificar el código para manejar excepciones y valores nulos correctamente.

Comments are closed.