Lea el archivo de parquet local sin la API de Hadoop Path

Estoy tratando de leer un archivo de Parquet local, sin embargo, las únicas API que puedo encontrar están estrechamente relacionadas con Hadoop y requieren un Hadoop Pathcomo entrada (incluso para apuntar a un archivo local).

Esto se ha pedido varias veces, pero hace bastante tiempo, y todas las respuestas están acopladas a Hadoop.

ParquetReader<GenericRecord> reader = AvroParquetReader.<GenericRecord>builder(file).build();
GenericRecord nextRecord = reader.read();

¿Cuál es la respuesta más popular sobre cómo leer un archivo de parquet, en un código independiente de Java ?, pero requiere un Hadoop Pathy ahora ha sido desaprobado por un misterioso InputFilelugar. La única implementación InputFileque puedo encontrar es HadoopInputFile, así que de nuevo no hay ayuda.

En Avro esto es simple:

DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
this.dataFileReader = new DataFileReader<>(file, datumReader);

(donde está el archivo java.io.File). ¿Cuál es el equivalente de parquet?

No pido ninguna Pathdependencia de Hadoop en las respuestas, porque Hadoop arrastra el infierno y el infierno, y parece una tontería requerirlo para leer archivos locales.

Para explicar más la historia de fondo, mantengo un pequeño complemento IntelliJ que permite a los usuarios arrastrar y soltar archivos Avro en un panel para verlos en una tabla. Este complemento es actualmente de 5 MB. Si incluyo las dependencias de Parquet y Hadoop, se hincha a más de 50 MB, y ni siquiera funciona.

ANEXO POST-RESPUESTA

Ahora que lo tengo funcionando (gracias a la respuesta aceptada), aquí está mi solución de trabajo que evita todos los errores molestos que pueden arrastrarse dependiendo en gran medida de la PathAPI de Hadoop :

Respuesta 1

Desafortunadamente, la implementación del parquet java no es independiente de algunas bibliotecas hadoop. Hay un problema existente en su rastreador de errores para facilitar la lectura y escritura de archivos de parquet en Java sin depender de hadoop, pero no parece haber mucho progreso al respecto. La InputFileinterfaz se agregó para agregar un poco de desacoplamiento, pero muchas de las clases que implementan la parte de metadatos del parquet y también todos los códecs de compresión viven dentro de la dependencia de hadoop.

Encontré otra implementación InputFileen la biblioteca de sonrisas , esto podría ser más eficiente que pasar por la abstracción del sistema de archivos hadoop, pero no resuelve el problema de dependencia.

Como otras respuestas ya mencionan, puede crear un hadoop Pathpara un archivo local y usarlo sin problemas.

java.io.File file = ...
new org.apache.hadoop.fs.Path(file.toURI())

El árbol de dependencias que hadoop extrae puede reducirse mucho definiendo algunas exclusiones. Estoy usando lo siguiente para reducir la hinchazón (usando la sintaxis de gradle):

compile("org.apache.hadoop:hadoop-common:3.1.0") {
    exclude(group: 'org.slf4j')
    exclude(group: 'org.mortbay.jetty')
    exclude(group: 'javax.servlet.jsp')
    exclude(group: 'com.sun.jersey')
    exclude(group: 'log4j')
    exclude(group: 'org.apache.curator')
    exclude(group: 'org.apache.zookeeper')
    exclude(group: 'org.apache.kerby')
    exclude(group: 'com.google.protobuf')
}
Respuesta: 2

Si la necesidad de no usar Hadoop es realmente inevitable, puede probar Spark y ejecutarlo en una versión local. Puede encontrar una guía de inicio rápido aquí: https://spark.apache.org/docs/latest/index.html . Para descargar, puede descargar en este enlace: https://archive.apache.org/dist/spark/ (encuentre una versión que le guste, siempre hay una compilación sin hadoop. Desafortunadamente, el tamaño de la versión comprimida todavía es de alrededor de 10 -15M). También podrá encontrar algunos ejemplos de Java en examples / src / main.

Después de eso, puede leer el archivo como un Spark Dataframe como este

import org.apache.spark.api.java.*;
import org.apache.spark.api.java.function.*; 

SparkSession spark = SparkSession.builder().appName("Reducing dependecy by adding more dependencies").master("local[*]").getOrCreate();
        DataFrame parquet = sqlContext.read().parquet("C:/files/myfile.csv.parquet");
    parquet.show(20);

Esta solución satisface las condiciones originales de la pregunta. Sin embargo, no carece del hecho de que es como andar por las ramas (pero demonios, sí, es gracioso). Aún así, podría ayudar abrir una nueva forma posible de abordar esto.

Respuesta: 3

Estoy usando JAI para cargar formatos de imagen que no son compatibles con ImageIO (por ejemplo, CUR, TIFF, etc.). Nunca he intentado con JIMI, porque parece usar nativos (y no debería usar JNI-based ...

Parece que no puedo entender por qué el elemento de la fila de mi lista no cambia de color: / ** Rellena las vistas en act_alliances.xml con datos de la base de datos * / private void loadAllianceData () {TblAlliances ...

Buenas tardes a todos; Actualmente estoy trabajando en un proyecto en Java para intentar crear una herramienta de escritorio. Mi pregunta es que ahora estoy usando un marco (plantuml) para obtener un gráfico con formato svg. Sin embargo, quiero ...

Estoy trabajando en un juego de plataformas de 2d-lado. He hecho algunas cosas hasta ahora. Estoy trabajando en una detección de colisión básica usando rectángulos de libgdx, así que teniendo en cuenta que solo tengo bloque de hierba por ahora, yo ...