Читайте файл паркета столбец за столбцом - PullRequest
0 голосов
/ 06 мая 2018

У меня есть файл паркета, содержащий архивные данные из таблицы RDBMS (поэтому в основном уровень повторения = 0 для всех значений). Мне нужно прочитать файл по одному столбцу за раз. В основном вот последовательность, которую я хочу выполнить: Считать все значения из столбца таблицы в файле паркета -> записать его в текстовый файл -> прочитать все значения из следующего столбца таблицы в файле паркета -> записать его в другой текстовый файл .... и так далее, и и пр.

Какой самый эффективный способ сделать это в Java?

PS: я выбрал формат паркета (в отличие от avro) для архивирования, так как паркет помогает мне добиться лучшего сжатия по сравнению с avro. Кроме того, поскольку мое требование состоит в том, чтобы считывать все значения столбца за раз, я предполагаю, что это будет быстрее с паркетом, учитывая присущий формату формат (хранение в столбцах).

[EDIT] Вот код, который я использую для чтения таблицы СУБД столбец за столбцом. Для простоты предположим, что все столбцы таблицы содержат значения String (Varchar):

public static void main(String[] args) throws IllegalArgumentException {

    Configuration conf = new Configuration();

    try {
        ParquetMetadata readFooter = ParquetFileReader.readFooter(conf, path, ParquetMetadataConverter.NO_FILTER);
        MessageType schema = readFooter.getFileMetaData().getSchema();
        ParquetFileReader r = new ParquetFileReader(conf, path, readFooter);
        PageReadStore rowGroup = null;

        try {

            while (null != (rowGroup = r.readNextRowGroup())) {
                numRowGroups++;
                rows+= rowGroup.getRowCount();

                ColumnReader colReader = null;
                ColumnReadStore colReadStore = new ColumnReadStoreImpl(rowGroup,new GroupRecordConverter(schema).getRootConverter(), schema, "blah");
                List<ColumnDescriptor> descriptorList = schema.getColumns();

                //for each column
                for(ColumnDescriptor colDescriptor:descriptorList) {

                    //Get datatype of the column 
                    PrimitiveTypeName type = colDescriptor.getType();

                    String[] columnNamePath = colDescriptor.getPath();
                    columnName =Arrays.toString(columnNamePath);
                    colReader = colReadStore.getColumnReader(colDescriptor);
                    long totalValuesInColumnChunk =  rowGroup.getPageReader(colDescriptor).getTotalValueCount();

                    //For every cell in the column chunk
                    for (int i = 0; i < totalValuesInColumnChunk; i++) {

                        System.out.println(columnName+" "+colReader.getBinary().toStringUsingUTF8());
                        colReader.consume();

                    }

                } 

            }
        } 
        catch(Exception ex){
            ex.printStackTrace();

        }
        finally {
            r.close();
        }
    } catch (IOException e) {
        System.out.println("Error reading parquet file.");
        e.printStackTrace();
    }

    System.out.println("Total number of rows: "+rows);

}
...