{"record":{"id":"9ac30cdde0d59ca2","repo":"apache/flink","slug":"missing-jobid","errorCode":null,"errorMessage":"Missing JobId","messagePattern":"Missing JobId","errorType":"validation","errorClass":"CliArgsException","httpStatus":null,"severity":"error","filePath":"flink-clients/src/main/java/org/apache/flink/client/cli/CliFrontend.java","lineNumber":1161,"sourceCode":"            }\n        } else {\n            t.printStackTrace();\n        }\n        return 1;\n    }\n\n    private static void logAndSysout(String message) {\n        LOG.info(message);\n        System.out.println(message);\n    }\n\n    // --------------------------------------------------------------------------------------------\n    //  Internal methods\n    // --------------------------------------------------------------------------------------------\n\n    private JobID parseJobId(String jobIdString) throws CliArgsException {\n        if (jobIdString == null) {\n            throw new CliArgsException(\"Missing JobId\");\n        }\n\n        final JobID jobId;\n        try {\n            jobId = JobID.fromHexString(jobIdString);\n        } catch (IllegalArgumentException e) {\n            throw new CliArgsException(e.getMessage());\n        }\n        return jobId;\n    }\n\n    /**\n     * Retrieves the {@link ClusterClient} from the given {@link CustomCommandLine} and runs the\n     * given {@link ClusterAction} against it.\n     *\n     * @param activeCommandLine to create the {@link ClusterDescriptor} from\n     * @param commandLine containing the parsed command line options\n     * @param clusterAction the cluster action to run against the retrieved {@link ClusterClient}.","sourceCodeStart":1143,"sourceCodeEnd":1179,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-clients/src/main/java/org/apache/flink/client/cli/CliFrontend.java#L1143-L1179","documentation":"The dictionary-id variant (readTimestamp(int id)) of the same hard rejection in the double reader of ParquetDataColumnReaderFactory: decoding a dictionary-encoded DOUBLE value as a timestamp is unsupported. It fires on dictionary-encoded pages under the same physical/logical type mismatch as the non-dictionary variant.","triggerScenarios":"Dictionary-encoded DOUBLE column read through a Flink TIMESTAMP schema — dictionaryDecode paths call readTimestamp(dictionaryId) on the double reader; schema evolution flipping a DOUBLE column to TIMESTAMP while old dictionary-encoded row groups remain.","commonSituations":"Same as the non-dictionary variant: epoch-as-double writers, schema drift, mismatched table DDL; manifests only when the page happens to be dictionary-encoded.","solutions":["Align the Flink column type with the file's DOUBLE physical type, or rewrite the data with proper INT64 timestamps","Verify the column's physical type with parquet-tools schema before defining the table","For legacy epoch-double data, read as DOUBLE and cast in SQL","Pin schemas: avoid changing a column's type without rewriting affected Parquet files"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"// Footer-level check: dictionary-encoded DOUBLE column declared as TIMESTAMP\nfor (ColumnChunkMetaData cc : block.getColumns()) {\n    if (cc.getPrimitiveType().getPrimitiveTypeName() == DOUBLE\n            && cc.getEncodings().stream().anyMatch(Encoding::usesDictionary)) {\n        // ensure the Flink schema types this column as DOUBLE, not TIMESTAMP\n    }\n}","typeGuard":"static boolean safeTimestampMapping(PrimitiveType pt, Collection<Encoding> encs) {\n    if (pt.getPrimitiveTypeName() == DOUBLE) return false;\n    return pt.getPrimitiveTypeName() == INT64 || pt.getPrimitiveTypeName() == INT96;\n}","tryCatchPattern":"try {\n    vectorizedReader.readToVector(...);\n} catch (RuntimeException e) {\n    if (\"Unsupported operation\".equals(e.getMessage())) {\n        // re-check schema mapping; deterministic — do not retry\n    } else throw e;\n}","preventionTips":["Pin column types: never flip a column between DOUBLE and TIMESTAMP without rewriting data","Include dictionary-encoded timestamp columns in writer/reader compatibility tests","Use schema derivation from files (or a schema registry) instead of drift-prone manual DDL"],"tags":["parquet","timestamp","type-mismatch","dictionary","double"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}