apache/flink · error · UnsupportedOperationException

is not supported now.

Error message

{} is not supported now.

What it means

UnsupportedOperationException from the default branch of createColumnReader in ParquetSplitReaderUtil. The factory maps logical types to column readers (primitives via their Parquet physical type, ARRAY/MAP/MULTISET/ROW via NestedColumnReader); any other LogicalTypeRoot reaches the throw with the offending type in the message.

Solutions

  1. Remove or cast the unsupported column out of the Parquet table schema
  2. Upgrade Flink to a version whose ParquetSplitReaderUtil supports the logical type (support grows release over release)
  3. Store the exotic column in a different format (e.g. JSON/AVRO string encoding) and parse downstream

Example fix

-- before
CREATE TABLE t (k INT, u DISTINCT_TYPE_OF_INT) WITH ('format'='parquet');
-- after: store as plain INT
CREATE TABLE t (k INT, u INT) WITH ('format'='parquet');
Defensive patterns

Strategy: type-guard

Type guard

static boolean isParquetReadableType(LogicalTypeRoot root) {
    return root == LogicalTypeRoot.CHAR || root == LogicalTypeRoot.VARCHAR
            || root == LogicalTypeRoot.BOOLEAN || root == LogicalTypeRoot.BINARY_STRING_OR_NONE
            || root == LogicalTypeRoot.TINYINT || root == LogicalTypeRoot.SMALLINT
            || root == LogicalTypeRoot.INTEGER || root == LogicalTypeRoot.BIGINT
            || root == LogicalTypeRoot.FLOAT || root == LogicalTypeRoot.DOUBLE
            || root == LogicalTypeRoot.DATE || root == LogicalTypeRoot.TIME_WITHOUT_TIME_ZONE
            || root == LogicalTypeRoot.TIMESTAMP_WITHOUT_TIME_ZONE
            || root == LogicalTypeRoot.TIMESTAMP_WITH_LOCAL_TIME_ZONE
            || root == LogicalTypeRoot.DECIMAL
            || root == LogicalTypeRoot.ARRAY || root == LogicalTypeRoot.MAP
            || root == LogicalTypeRoot.MULTISET || root == LogicalTypeRoot.ROW;
}

Try / catch

catch (UnsupportedOperationException e) { if (e.getMessage().endsWith("is not supported now.")) { /* remove or cast the column, or upgrade Flink */ } else throw e; }

Prevention

When it happens

Trigger: createColumnReader(...) called with a fieldType outside the supported set - e.g. DISTINCT_TYPE, STRUCTURED_TYPE, SYMBOL, RAW, UNRESOLVED, or TIMESTAMP variants whose physical Parquet type has no branch in that Flink version.

Common situations: Table schemas carrying user-defined/structured types or RAW types over Parquet; reading Parquet written by newer writers whose logical type annotations the older Flink reader does not map; incomplete type support in the vectorized path of a given release.

Related errors


AI-assisted analysis of apache/flink@2f3c205e92 (2026-08-14). Data as JSON: /api/errors/a4acc295cb6a5b16. Report an issue: GitHub.

Appendix: source

Thrown at flink-formats/flink-parquet/src/main/java/org/apache/flink/formats/parquet/vector/ParquetSplitReaderUtil.java:378

                    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:
            case MAP:
            case MULTISET:
            case ROW:
                return new NestedColumnReader(isUtcTimestamp, pages, field);
            default:
                throw new UnsupportedOperationException(fieldType + " is not supported now.");
        }
    }

    public static WritableColumnVector createWritableColumnVector(
            int batchSize,
            LogicalType fieldType,
            Type type,
            List<ColumnDescriptor> columnDescriptors,
            int depth) {
        List<ColumnDescriptor> descriptors =
                getAllColumnDescriptorByType(depth, type, columnDescriptors);
        PrimitiveType primitiveType = descriptors.get(0).getPrimitiveType();
        PrimitiveType.PrimitiveTypeName typeName = primitiveType.getPrimitiveTypeName();
        switch (fieldType.getTypeRoot()) {
            case BOOLEAN:
                checkArgument(
                        typeName == PrimitiveType.PrimitiveTypeName.BOOLEAN,
                        "Unexpected type: %s",

View on GitHub (pinned to 2f3c205e92)