Leer datos de parqué de ByteArrayOutputStream en lugar de archivo

chrismead:

Me gustaría convertir este código:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.parquet.column.page.PageReadStore;
import org.apache.parquet.example.data.simple.SimpleGroup;
import org.apache.parquet.example.data.simple.convert.GroupRecordConverter;
import org.apache.parquet.hadoop.ParquetFileReader;
import org.apache.parquet.hadoop.util.HadoopInputFile;
import org.apache.parquet.io.ColumnIOFactory;
import org.apache.parquet.io.MessageColumnIO;
import org.apache.parquet.io.RecordReader;
import org.apache.parquet.schema.MessageType;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class ParquetReaderUtils {

    public static Parquet getParquetData(String filePath) throws IOException {
        List<SimpleGroup> simpleGroups = new ArrayList<>();
        ParquetFileReader reader = ParquetFileReader.open(HadoopInputFile.fromPath(new Path(filePath), new Configuration()));
        MessageType schema = reader.getFooter().getFileMetaData().getSchema();
        //List<Type> fields = schema.getFields();
        PageReadStore pages;
        while ((pages = reader.readNextRowGroup()) != null) {
            long rows = pages.getRowCount();
            MessageColumnIO columnIO = new ColumnIOFactory().getColumnIO(schema);
            RecordReader recordReader = columnIO.getRecordReader(pages, new GroupRecordConverter(schema));

            for (int i = 0; i < rows; i++) {
                SimpleGroup simpleGroup = (SimpleGroup) recordReader.read();
                simpleGroups.add(simpleGroup);
            }
        }
        reader.close();
        return new Parquet(simpleGroups, schema);
    }
}

(que es de https://www.arm64.ca/post/reading-parquet-files-java/ )

tomar un parámetro ByteArrayOutputStream en lugar de una ruta de archivo.

es posible? No veo un ParquetStreamReader en org.apache.parquet.hadoop.

Cualquier ayuda es apreciada. Estoy tratando de escribir una aplicación de prueba para parquet procedentes de kafka y escribir cada uno de los muchos mensajes a un archivo es bastante lento.

m4gic:

Por lo tanto, sin pruebas más profundo, me gustaría probar con esta clase (aunque el contenido de la OutputStream debe ser compatible parquet). Me puso en su lugar una StreamID para hacer la identificación del procesado bytearray más fácil (el ParquetFileReader imprime el instance.toString () si algo ha ido mal).

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import org.apache.parquet.io.DelegatingSeekableInputStream;
import org.apache.parquet.io.InputFile;
import org.apache.parquet.io.SeekableInputStream;

public class ParquetStream implements InputFile
{
  private final String streamId;
  private final byte[] data;

  public class SeekableByteArrayInputStream extends ByteArrayInputStream
  {
     public SeekableByteArrayInputStream(byte[] buf)
     {
        super(buf);
     }

     public void setPos(int pos)
     {
        this.pos = pos;
     }

     public int getPos()
     {
        return this.pos;
     }
 }

public ParquetStream(String streamId, ByteArrayOutputStream stream)
{
    this.streamId = streamId;
    this.data = stream.toByteArray();
}

@Override
public long getLength() throws IOException
{
    return this.data.length;
}

@Override
public SeekableInputStream newStream() throws IOException
{
    return new DelegatingSeekableInputStream(new SeekableByteArrayInputStream(this.data))
    {

        @Override
        public void seek(long newPos) throws IOException
        {
            ((SeekableByteArrayInputStream) this.getStream()).setPos(new Long(newPos).intValue());
        }

        @Override
        public long getPos() throws IOException
        {
            return new Integer(((SeekableByteArrayInputStream) this.getStream()).getPos()).longValue();
        }
    };
}

@Override
public String toString()
{
    return new StringBuilder("ParquetStream[").append(streamId).append("]").toString();
}

}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=315149&siteId=1
Recomendado
Clasificación