{"record":{"id":"f14ff4aefc1b6e06","repo":"apache/druid","slug":"object-cannot-be-deserialized-to-a-tdigest-sketch","errorCode":null,"errorMessage":"Object cannot be deserialized to a TDigest Sketch: ","messagePattern":"Object cannot be deserialized to a TDigest Sketch: ","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchUtils.java","lineNumber":47,"sourceCode":"\npublic class TDigestSketchUtils\n{\n  // Class is not meant to be instantiated\n  private TDigestSketchUtils()\n  {\n  }\n\n  public static MergingDigest deserialize(Object serializedSketch)\n  {\n    if (serializedSketch instanceof String) {\n      String str = (String) serializedSketch;\n      return MergingDigest.fromBytes(ByteBuffer.wrap(StringUtils.decodeBase64(StringUtils.toUtf8(str))));\n    } else if (serializedSketch instanceof byte[]) {\n      return MergingDigest.fromBytes(ByteBuffer.wrap((byte[]) serializedSketch));\n    } else if (serializedSketch instanceof MergingDigest) {\n      return (MergingDigest) serializedSketch;\n    }\n    throw new IAE(\n        \"Object cannot be deserialized to a TDigest Sketch: \"\n        + serializedSketch.getClass()\n    );\n  }\n\n  static byte[] toBytes(MergingDigest tDigest)\n  {\n    byte[] arr = new byte[tDigest.byteSize()];\n    ByteBuffer result = ByteBuffer.wrap(arr);\n    tDigest.asBytes(result);\n    return result.array();\n  }\n\n  /**\n   * This method computes an estimate of the max intermediate size of a {@link MergingDigest}.\n   * Since there is no utility available in the T-Digest library to compute this size,\n   * the below code is inspired by looking at\n   * {@link MergingDigest#MergingDigest(double, int, int)}","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchUtils.java#L29-L65","documentation":"TDigestSketchUtils.deserialize() is a generic type-guard/normalizer: it accepts a base64 String, a raw byte[], or an already-decoded MergingDigest. The error fires for any other runtime type (or a payload that fails the accepted decoding path), meaning the stored or transmitted sketch value is not in a format this extension can turn into a MergingDigest.","triggerScenarios":"Thrown at extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchUtils.java:47 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure persisted sketch values are base64 strings or byte[] produced by the tdigestsketch serde","If the value is a corrupted or truncated base64/byte payload, re-aggregate or re-ingest the affected rows","Check that no intermediary step (e.g. custom code or a different serde) is substituting another object type for the sketch"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}