德鲁伊 - 一组列的不同值

Druid - Distinct values of a set of columns

我需要使用 REST/JSON API 从 Druid 中的索引中获取一组维度的不同值。目前我正在使用以下聚合查询(尽管我不需要聚合),因为我找不到任何其他方法来获取不同的值,因为所有查询都要求聚合字段。

{
  "queryType": "groupBy",
  "dataSource": "ds1",
  "granularity": "all",
  "dimensions": ["level1","level2","level3", "val1", "val2"],
  "aggregations": [{"type": "count","name": "val2Count","fieldName": "val2"}],
  "intervals": ["2015-10-22T00:00:00.000/2015-12-22T23:00:00.000"]
}
  1. 我认为这是一个常见的场景。有没有办法在没有聚合的情况下获得不同的列集?

  2. 当我使用聚合进行操作时,如果没有聚合,这种聚合对性能的影响有多大(除了用于额外计数数据的网络 IO)?

您可以使用元数据查询。此查询将为每个维度提供基数估计。 http://druid.io/docs/latest/querying/segmentmetadataquery.html 虽然如果你想列出所有不同的组合,比如 dimension1 和 dimension2,你必须在 dimension1 和 dimension2 上使用 groupBy。添加计数聚合器不会真正影响性能。

您可以使用 select 查询来执行相同的操作。 http://druid.io/docs/latest/querying/select-query.html

{
    "queryType": "select",
    "dataSource": "ds1",
    "granularity": "all",
    "descending": "true",
    "intervals": ["2016-05-01T00:00:00.000/2016-06-01T00:00:00.000"],
    "dimensions":["level1","level2","level3", "val1", "val2"],
    "pagingSpec":{"pagingIdentifiers": {}, "threshold":5}
}

如果你只有一个维度,那么你也可以使用 Lexicographic TopNMetricSpec。 http://druid.io/docs/latest/querying/topnmetricspec.html

我一直在寻找相同的答案,在自己进行一些测试后,我发现以下查询比 GROUP BY 的性能更高:

SELECT APPROX_COUNT_DISTINCT(CONCAT(level1, level2, level3, level4, level5))
FROM ds1
WHERE __time >= CURRENT_DATE - INTERVAL '1' DAY

^ 上面这个对我来说比下面的要好得多

SELECT SUM("count") AS distinct_count
FROM (
  SELECT 1 AS "count"
  FROM ds1
  WHERE __time >= CURRENT_DATE - INTERVAL '1' DAY
  GROUP BY level1, level2, level3, level4, level5
)