@SuppressWarnings("unchecked") public static <T> ParquetValueWriter<T> buildWriter(MessageType type) { return (ParquetValueWriter<T>) ParquetTypeVisitor.visit(type, new WriteBuilder(type)); }
private static <T> List<T> visitFields(GroupType group, ParquetTypeVisitor<T> visitor) { List<T> results = Lists.newArrayListWithExpectedSize(group.getFieldCount()); for (Type field : group.getFields()) { results.add(visitField(field, visitor)); } return results; }
public static <T> T visit(Type type, ParquetTypeVisitor<T> visitor) { if (type instanceof MessageType) { return visitor.message((MessageType) type, visitFields(type.asGroupType(), visitor)); return visitor.primitive(type.asPrimitiveType()); T elementResult = null; if (repeatedElement.getFieldCount() > 0) { elementResult = visitField(repeatedElement.getType(0), visitor); return visitor.list(group, elementResult); case 2: keyResult = visitField(repeatedKeyValue.getType(0), visitor); valueResult = visitField(repeatedKeyValue.getType(1), visitor); case 1: keyResult = visitField(keyOrValue, visitor); valueResult = visitField(keyOrValue, visitor); return visitor.map(group, keyResult, valueResult); return visitor.struct(group, visitFields(group, visitor));
private static <T> T visitField(Type field, ParquetTypeVisitor<T> visitor) { visitor.fieldNames.push(field.getName()); try { return visit(field, visitor); } finally { visitor.fieldNames.pop(); } }
@SuppressWarnings("unchecked") public static <T> ParquetValueWriter<T> buildWriter(MessageType type) { return (ParquetValueWriter<T>) ParquetTypeVisitor.visit(type, new WriteBuilder(type)); }
public static boolean hasIds(MessageType fileSchema) { try { // Try to convert the type to Iceberg. If an ID assignment is needed, return false. ParquetTypeVisitor.visit(fileSchema, new MessageTypeToType(fileSchema) { @Override protected int nextId() { throw new IllegalStateException("Needed to assign ID"); } }); // no assignment was needed return true; } catch (IllegalStateException e) { // at least one field was missing an id. return false; } }
public static MessageType pruneColumns(MessageType fileSchema, Schema expectedSchema) { // column order must match the incoming type, so it doesn't matter that the ids are unordered Set<Integer> selectedIds = TypeUtil.getProjectedIds(expectedSchema); return (MessageType) ParquetTypeVisitor.visit(fileSchema, new PruneColumns(selectedIds)); }
public static Schema convert(MessageType parquetSchema) { MessageTypeToType converter = new MessageTypeToType(parquetSchema); return new Schema( ParquetTypeVisitor.visit(parquetSchema, converter).asNestedType().fields(), converter.getAliases()); }