in paimon-format/src/main/java/org/apache/paimon/format/parquet/reader/ParquetSplitReaderUtil.java [63:186]
public static ColumnReader createColumnReader(
DataType fieldType,
Type type,
List<ColumnDescriptor> columnDescriptors,
PageReadStore pages,
int depth)
throws IOException {
List<ColumnDescriptor> descriptors =
getAllColumnDescriptorByType(depth, type, columnDescriptors);
switch (fieldType.getTypeRoot()) {
case BOOLEAN:
return new BooleanColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case TINYINT:
return new ByteColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case DOUBLE:
return new DoubleColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case FLOAT:
return new FloatColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case INTEGER:
case DATE:
case TIME_WITHOUT_TIME_ZONE:
return new IntColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case BIGINT:
return new LongColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case SMALLINT:
return new ShortColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case CHAR:
case VARCHAR:
case BINARY:
case VARBINARY:
return new BytesColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case TIMESTAMP_WITHOUT_TIME_ZONE:
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
if (descriptors.get(0).getPrimitiveType().getPrimitiveTypeName()
== PrimitiveType.PrimitiveTypeName.INT64) {
return new LongColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
}
return new TimestampColumnReader(
true, descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case DECIMAL:
switch (descriptors.get(0).getPrimitiveType().getPrimitiveTypeName()) {
case INT32:
return new IntColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case INT64:
return new LongColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case BINARY:
return new BytesColumnReader(
descriptors.get(0), pages.getPageReader(descriptors.get(0)));
case FIXED_LEN_BYTE_ARRAY:
return new FixedLenBytesColumnReader(
descriptors.get(0),
pages.getPageReader(descriptors.get(0)),
((DecimalType) fieldType).getPrecision());
}
case ARRAY:
return new ArrayColumnReader(
descriptors.get(0),
pages.getPageReader(descriptors.get(0)),
true,
descriptors.get(0).getPrimitiveType(),
fieldType);
case MAP:
MapType mapType = (MapType) fieldType;
ArrayColumnReader mapKeyReader =
new ArrayColumnReader(
descriptors.get(0),
pages.getPageReader(descriptors.get(0)),
true,
descriptors.get(0).getPrimitiveType(),
new ArrayType(mapType.getKeyType()));
ArrayColumnReader mapValueReader =
new ArrayColumnReader(
descriptors.get(1),
pages.getPageReader(descriptors.get(1)),
true,
descriptors.get(1).getPrimitiveType(),
new ArrayType(mapType.getValueType()));
return new MapColumnReader(mapKeyReader, mapValueReader);
case MULTISET:
MultisetType multisetType = (MultisetType) fieldType;
ArrayColumnReader multisetKeyReader =
new ArrayColumnReader(
descriptors.get(0),
pages.getPageReader(descriptors.get(0)),
true,
descriptors.get(0).getPrimitiveType(),
new ArrayType(multisetType.getElementType()));
ArrayColumnReader multisetValueReader =
new ArrayColumnReader(
descriptors.get(1),
pages.getPageReader(descriptors.get(1)),
true,
descriptors.get(1).getPrimitiveType(),
new ArrayType(new IntType(false)));
return new MapColumnReader(multisetKeyReader, multisetValueReader);
case ROW:
RowType rowType = (RowType) fieldType;
GroupType groupType = type.asGroupType();
List<ColumnReader> fieldReaders = new ArrayList<>();
for (int i = 0; i < rowType.getFieldCount(); i++) {
fieldReaders.add(
createColumnReader(
rowType.getTypeAt(i),
groupType.getType(i),
descriptors,
pages,
depth + 1));
}
return new RowColumnReader(fieldReaders);
default:
throw new UnsupportedOperationException(fieldType + " is not supported now.");
}
}