public ParquetMapEntryConverter(Type prestoType, String columnName, GroupType entryType) { checkArgument(StandardTypes.MAP.equals(prestoType.getTypeSignature().getBase())); // original version of parquet used null for entry due to a bug if (entryType.getOriginalType() != null) { checkArgument( entryType.getOriginalType() == MAP_KEY_VALUE, "Expected MAP column '%s' field to be type %s, but is %s", columnName, MAP_KEY_VALUE, entryType); } GroupType entryGroupType = entryType.asGroupType(); checkArgument( entryGroupType.getFieldCount() == 2, "Expected MAP column '%s' entry to have two fields, but has %s fields", columnName, entryGroupType.getFieldCount()); checkArgument( entryGroupType.getFieldName(0).equals("key"), "Expected MAP column '%s' entry field 0 to be named 'key', but is named %s", columnName, entryGroupType.getFieldName(0)); checkArgument( entryGroupType.getFieldName(1).equals("value"), "Expected MAP column '%s' entry field 1 to be named 'value', but is named %s", columnName, entryGroupType.getFieldName(1)); checkArgument( entryGroupType.getType(0).isPrimitive(), "Expected MAP column '%s' entry field 0 to be primitive, but is named %s", columnName, entryGroupType.getType(0)); keyConverter = createConverter( prestoType.getTypeParameters().get(0), columnName + ".key", entryGroupType.getFields().get(0)); valueConverter = createConverter( prestoType.getTypeParameters().get(1), columnName + ".value", entryGroupType.getFields().get(1)); }
public PrestoReadSupport( boolean useParquetColumnNames, List<HiveColumnHandle> columns, MessageType messageType) { this.columns = columns; this.useParquetColumnNames = useParquetColumnNames; ImmutableList.Builder<Converter> converters = ImmutableList.builder(); for (int i = 0; i < columns.size(); i++) { HiveColumnHandle column = columns.get(i); if (!column.isPartitionKey()) { parquet.schema.Type parquetType = getParquetType(column, messageType); if (parquetType == null) { continue; } if (parquetType.isPrimitive()) { converters.add(new ParquetPrimitiveColumnConverter(i)); } else { GroupType groupType = parquetType.asGroupType(); switch (column.getTypeSignature().getBase()) { case ARRAY: ParquetColumnConverter listConverter = new ParquetColumnConverter( new ParquetListConverter(types[i], groupType.getName(), groupType), i); converters.add(listConverter); break; case StandardTypes.MAP: ParquetColumnConverter mapConverter = new ParquetColumnConverter( new ParquetMapConverter(types[i], groupType.getName(), groupType), i); converters.add(mapConverter); break; case ROW: ParquetColumnConverter rowConverter = new ParquetColumnConverter( new ParquetStructConverter(types[i], groupType.getName(), groupType), i); converters.add(rowConverter); break; default: throw new IllegalArgumentException( "Group column " + groupType.getName() + " type " + groupType.getOriginalType() + " not supported"); } } } } this.converters = converters.build(); }
public ParquetListEntryConverter(Type prestoType, String columnName, GroupType elementType) { checkArgument( elementType.getOriginalType() == null, "Expected LIST column '%s' field to be type STRUCT, but is %s", columnName, elementType); checkArgument( elementType.getFieldCount() == 1, "Expected LIST column '%s' element to have one field, but has %s fields", columnName, elementType.getFieldCount()); elementConverter = createConverter(prestoType, columnName + ".element", elementType.getType(0)); }