У меня есть файл паркета, содержащий архивные данные из таблицы 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);
}