prestodb/presto · error · IllegalArgumentException

Unsupported flat map key type:

Error message

Unsupported flat map key type: 

What it means

MapFlatBatchStreamReader.getKeyBlockTemplate builds a Block template for the flat map's key column based on the key's ORC type. Only LONG and STRING/BINARY keys are supported; any other keyOrcType (e.g. DOUBLE, TIMESTAMP, DECIMAL) hits the default branch and throws IllegalArgumentException('Unsupported flat map key type: ' + keyOrcType). DWRF flat map storage only defines inlined key storage for those types.

Solutions

  1. Inspect the flat map's key type in the DWRF footer to confirm which type is used.
  2. Upgrade Presto to a version supporting the key type (newer versions added more key templates).
  3. Re-write the data as a regular MAP column (MAP_DIRECT encoding) instead of flat map.
  4. Convert the map keys to STRING on the writer side so the STRING/BINARY template is used.

Example fix

// before — flat map keyed by DOUBLE
{"flatMap": {1.5: "a"}}
// after — cast keys to STRING on write
{"flatMap": {"1.5": "a"}}
Defensive patterns

Strategy: validation

Validate before calling

OrcType keyOrcType = dwrfType.getKeyType();
if (!(keyOrcType.getOrcTypeKind() == LONG || keyOrcType.getOrcTypeKind() == STRING || keyOrcType.getOrcTypeKind() == BINARY)) {
    throw new PrestoException(NOT_SUPPORTED, "Flat map key type " + keyOrcType + " unsupported; rewrite as MAP");
}

Type guard

boolean isSupportedFlatMapKeyType(OrcTypeKind kind) {
    return kind == LONG || kind == STRING || kind == BINARY;
}

Try / catch

try {
    reader.startStripe(timezone, stripe);
}
catch (IllegalArgumentException e) {
    throw new PrestoException(NOT_SUPPORTED, "Flat map key type not supported: " + e.getMessage(), e);
}

Prevention

When it happens

Trigger: startStripe on a DWRF FLAT_MAP column whose key type is not LONG, STRING, or BINARY — e.g. flat maps keyed by double/decimal/timestamp written by DWRF tooling.

Common situations: Reading DWRF files that use extended flat-map key types unsupported by the current Presto version; writer/tooling emitting flat maps with non-standard key types; cross-version file interchange.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/1b95b0813fe47f82. Report an issue: GitHub.

Appendix: source

Thrown at presto-orc/src/main/java/com/facebook/presto/orc/reader/MapFlatBatchStreamReader.java:285

        presentStream = null;

        rowGroupOpen = false;
    }

    private Block getKeyBlockTemplate(Collection<DwrfSequenceEncoding> sequenceEncodings)
    {
        switch (keyOrcType) {
            case BYTE:
            case SHORT:
            case INT:
            case LONG:
                return getIntegerKeyBlockTemplate(sequenceEncodings);
            case STRING:
            case BINARY:
                return getSliceKeysBlockTemplate(sequenceEncodings);
            default:
                throw new IllegalArgumentException("Unsupported flat map key type: " + keyOrcType);
        }
    }

    private Block getIntegerKeyBlockTemplate(Collection<DwrfSequenceEncoding> sequenceEncodings)
    {
        Type keyType;

        switch (keyOrcType) {
            case BYTE:
                keyType = TinyintType.TINYINT;
                break;
            case SHORT:
                keyType = SmallintType.SMALLINT;
                break;
            case INT:
                keyType = IntegerType.INTEGER;
                break;
            case LONG:

View on GitHub (pinned to 55bb57d202)