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.
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 reader = AvroParquetReader. builder (HadoopInputFile.fromPath (new Path(tempFile.getAbsolutePath()), conf)).build ();
Configuración conf = nueva configuración ();
ParquetReader
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.