in parquet/src/main/java/org/apache/iceberg/data/parquet/BaseParquetWriter.java [60:174]
protected abstract ParquetValueWriter<?> timestampWriter(
ColumnDescriptor desc, boolean isAdjustedToUTC);
private class WriteBuilder extends TypeWithSchemaVisitor<ParquetValueWriter<?>> {
private final MessageType type;
private WriteBuilder(MessageType type) {
this.type = type;
}
@Override
public ParquetValueWriter<?> message(
Types.StructType struct, MessageType message, List<ParquetValueWriter<?>> fieldWriters) {
return struct(struct, message.asGroupType(), fieldWriters);
}
@Override
public ParquetValueWriter<?> struct(
Types.StructType iceberg, GroupType struct, List<ParquetValueWriter<?>> fieldWriters) {
List<Type> fields = struct.getFields();
List<ParquetValueWriter<?>> writers = Lists.newArrayListWithExpectedSize(fieldWriters.size());
for (int i = 0; i < fields.size(); i += 1) {
Type fieldType = struct.getType(i);
int fieldD = type.getMaxDefinitionLevel(path(fieldType.getName()));
writers.add(ParquetValueWriters.option(fieldType, fieldD, fieldWriters.get(i)));
}
return createStructWriter(iceberg, writers);
}
@Override
public ParquetValueWriter<?> list(
Types.ListType iceberg, GroupType array, ParquetValueWriter<?> elementWriter) {
GroupType repeated = array.getFields().get(0).asGroupType();
String[] repeatedPath = currentPath();
int repeatedD = type.getMaxDefinitionLevel(repeatedPath);
int repeatedR = type.getMaxRepetitionLevel(repeatedPath);
Type elementType = repeated.getType(0);
int elementD = type.getMaxDefinitionLevel(path(elementType.getName()));
return ParquetValueWriters.collections(
repeatedD, repeatedR, ParquetValueWriters.option(elementType, elementD, elementWriter));
}
@Override
public ParquetValueWriter<?> map(
Types.MapType iceberg,
GroupType map,
ParquetValueWriter<?> keyWriter,
ParquetValueWriter<?> valueWriter) {
GroupType repeatedKeyValue = map.getFields().get(0).asGroupType();
String[] repeatedPath = currentPath();
int repeatedD = type.getMaxDefinitionLevel(repeatedPath);
int repeatedR = type.getMaxRepetitionLevel(repeatedPath);
Type keyType = repeatedKeyValue.getType(0);
int keyD = type.getMaxDefinitionLevel(path(keyType.getName()));
Type valueType = repeatedKeyValue.getType(1);
int valueD = type.getMaxDefinitionLevel(path(valueType.getName()));
return ParquetValueWriters.maps(
repeatedD,
repeatedR,
ParquetValueWriters.option(keyType, keyD, keyWriter),
ParquetValueWriters.option(valueType, valueD, valueWriter));
}
@Override
public ParquetValueWriter<?> primitive(
org.apache.iceberg.types.Type.PrimitiveType iceberg, PrimitiveType primitive) {
ColumnDescriptor desc = type.getColumnDescription(currentPath());
LogicalTypeAnnotation logicalType = primitive.getLogicalTypeAnnotation();
if (logicalType != null) {
Optional<ParquetValueWriter<?>> writer =
logicalType.accept(new LogicalTypeWriterVisitor(desc));
if (writer.isPresent()) {
return writer.get();
}
}
switch (primitive.getPrimitiveTypeName()) {
case FIXED_LEN_BYTE_ARRAY:
return fixedWriter(desc);
case BINARY:
return ParquetValueWriters.byteBuffers(desc);
case BOOLEAN:
return ParquetValueWriters.booleans(desc);
case INT32:
return ParquetValueWriters.ints(desc);
case INT64:
return ParquetValueWriters.longs(desc);
case FLOAT:
return ParquetValueWriters.floats(desc);
case DOUBLE:
return ParquetValueWriters.doubles(desc);
default:
throw new UnsupportedOperationException("Unsupported type: " + primitive);
}
}
@Override
public ParquetValueWriter<?> variant(
Types.VariantType iVariant, GroupType variant, ParquetValueWriter<?> result) {
return result;
}
@Override
public ParquetVariantVisitor<ParquetValueWriter<?>> variantVisitor() {
return new VariantWriterBuilder(type, Arrays.asList(currentPath()));
}
}