Skip to content

ClassCastException in groupBy when sorting on numeric columns containing nulls #6123

@jihoonson

Description

@jihoonson

Here is the sample query.

{
  "queryType": "groupBy",
  "dataSource": {
    "type": "table",
    "name": "wikiticker"
  },
  "intervals": {
    "type": "intervals",
    "intervals": [
      "-146136543-09-08T08:23:32.096Z/146140482-04-24T15:36:27.903Z"
    ]
  },
  "virtualColumns": [
    {
      "type": "expression",
      "name": "d0:v",
      "expression": "timestamp_floor(\"__time\",'PT1H','','UTC')",
      "outputType": "LONG"
    }
  ],
  "filter": null,
  "granularity": {
    "type": "all"
  },
  "dimensions": [
    {
      "type": "default",
      "dimension": "d0:v",
      "outputName": "d0",
      "outputType": "LONG"
    },
    {
      "type": "default",
      "dimension": "cityName",
      "outputName": "d1",
      "outputType": "STRING"
    }
  ],
  "aggregations": [],
  "postAggregations": [],
  "having": null,
  "limitSpec": {
    "type": "default",
    "columns": [
      {
        "dimension": "d0",
        "direction": "descending",
        "dimensionOrder": {
          "type": "numeric"
        }
      },
      {
        "dimension": "d1",
        "direction": "ascending",
        "dimensionOrder": {
          "type": "lexicographic"
        }
      }
    ],
    "limit": 5000
  },
  "context": {
    "timeout": 300000
  },
  "descending": false
}

If __time column contains nulls, this query throws an error like below.

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
        at java.lang.Long.compareTo(Long.java:54) ~[?:1.8.0_163]
        at com.google.common.collect.NaturalOrdering.compare(NaturalOrdering.java:35) ~[guava-16.0.1.jar:?]
        at com.google.common.collect.NaturalOrdering.compare(NaturalOrdering.java:26) ~[guava-16.0.1.jar:?]
        at com.google.common.collect.NullsFirstOrdering.compare(NullsFirstOrdering.java:44) ~[guava-16.0.1.jar:?]
        at io.druid.query.groupby.GroupByQuery.compareDimsForLimitPushDown(GroupByQuery.java:582) ~[druid-processing-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.query.groupby.GroupByQuery.access$000(GroupByQuery.java:81) ~[druid-processing-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.query.groupby.GroupByQuery$1.compare(GroupByQuery.java:416) ~[druid-processing-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.query.groupby.GroupByQuery$1.compare(GroupByQuery.java:412) ~[druid-processing-0.12.1-iap8.jar:0.12.1-iap8]
        at com.google.common.collect.ComparatorOrdering.compare(ComparatorOrdering.java:38) ~[guava-16.0.1.jar:?]
        at io.druid.common.guava.CombiningSequence$CombiningAccumulator.accumulate(CombiningSequence.java:260) ~[druid-common-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.YieldingAccumulators$1.accumulate(YieldingAccumulators.java:35) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.MergeSequence.makeYielder(MergeSequence.java:106) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.MergeSequence.toYielder(MergeSequence.java:94) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.LazySequence.toYielder(LazySequence.java:46) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.query.RetryQueryRunner$1.toYielder(RetryQueryRunner.java:102) ~[druid-processing-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.YieldingSequenceBase.accumulate(YieldingSequenceBase.java:32) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.common.guava.CombiningSequence.accumulate(CombiningSequence.java:64) ~[druid-common-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.MappedSequence.accumulate(MappedSequence.java:43) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.query.groupby.orderby.TopNSequence$1.make(TopNSequence.java:55) ~[druid-processing-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.BaseSequence.toYielder(BaseSequence.java:65) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.WrappingSequence$2.get(WrappingSequence.java:87) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.WrappingSequence$2.get(WrappingSequence.java:83) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.SequenceWrapper.wrap(SequenceWrapper.java:55) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.WrappingSequence.toYielder(WrappingSequence.java:82) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.MappedSequence.toYielder(MappedSequence.java:49) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.WrappingSequence$2.get(WrappingSequence.java:87) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.WrappingSequence$2.get(WrappingSequence.java:83) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.query.CPUTimeMetricQueryRunner$1.wrap(CPUTimeMetricQueryRunner.java:74) ~[druid-processing-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.WrappingSequence.toYielder(WrappingSequence.java:82) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.java.util.common.guava.Yielders.each(Yielders.java:32) ~[java-util-0.12.1-iap8.jar:0.12.1-iap8]
        at io.druid.server.QueryResource.doPost(QueryResource.java:193) [druid-server-0.12.1-iap8.jar:0.12.1-iap8]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_163]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_163]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_163]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_163]2018-08-07T20:49:53,620

druid-0.12.1-iap8 is almost same with 0.12.2.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions