apache/druid · error · ParseException

Timestamp[ ] is unparseable! Event

Error message

Timestamp[%s] is unparseable! Event: %s

What it means

MapInputRowParser.parseTimestampOrThrowParseException throws this ParseException when the TimestampSpec cannot parse the row's timestamp value. The timestamp string did not match any configured format or parse function, so the row cannot be assigned a primary timestamp.

Solutions

  1. Fix the timestampSpec format/pattern to match the actual data
  2. Verify the timestamp column name points to the right field
  3. Pre-normalize timestamps in the parse spec (e.g. with a transform)
  4. Check the row content in the exception message for the actual timestamp representation

Example fix

// before
"timestampSpec": {"column": "ts", "format": "iso"}  // data: 01/02/2024 10:00:00
// after
"timestampSpec": {"column": "ts", "format": "MM/dd/yyyy HH:mm:ss"}
Defensive patterns

Strategy: validation

Validate before calling

// sample-check timestamp parse before ingestion
try { new TimestampSpec("ts", "iso", null).parseDateTime(row.get("ts")); } catch (Exception e) { /* bad format */ }

Type guard

boolean isParseable(Object v, TimestampSpec ts) { try { ts.parseDateTime(v); return true; } catch (Exception e) { return false; } }

Try / catch

try { parser.parseBatch(rows); } catch (ParseException e) { log.error("Bad timestamp in row: {}", e.getMessage()); sendToDeadLetter(e); }

Prevention

When it happens

Trigger: A row whose timestamp field value cannot be interpreted by the configured timestampSpec (wrong format, missing column, null value) - specifically when TimestampSpec.parseDateTime throws.

Common situations: Timestamps in a different format than spec.format/pattern expects, ISO strings fed to a 'millis' format, timestamps in a column other than the configured column, locale/timezone mismatches.

Related errors


AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07). Data as JSON: /api/errors/acf31ff4714afac8. Report an issue: GitHub.

Appendix: source

Thrown at processing/src/main/java/org/apache/druid/data/input/impl/MapInputRowParser.java:154

   *
   * @param timeValue      object to interpret as timestmap
   * @param timestampSpec  timestamp spec
   * @param rawMapSupplier supplier of the original raw data that this object came from. Used for error messages.
   */
  public static DateTime parseTimestampOrThrowParseException(
      final Object timeValue,
      final TimestampSpec timestampSpec,
      final Supplier<Map<String, ?>> rawMapSupplier
  )
  {
    final DateTime timestamp;

    try {
      timestamp = timestampSpec.parseDateTime(timeValue);
    }
    catch (Exception e) {
      String rawMap = rawMapToPrint(rawMapSupplier.get());
      throw new ParseException(
          rawMap,
          e,
          "Timestamp[%s] is unparseable! Event: %s",
          timeValue,
          rawMap
      );
    }
    if (timestamp == null) {
      String rawMap = rawMapToPrint(rawMapSupplier.get());
      throw new ParseException(
          rawMap,
          "Timestamp[%s] is unparseable! Event: %s",
          timeValue,
          rawMap
      );
    }
    if (!Intervals.ETERNITY.contains(timestamp)) {
      String rawMap = rawMapToPrint(rawMapSupplier.get());

View on GitHub (pinned to 9b90983fd2)