如何在同一个查询中与 Druid SQL 中的其他列一起使用多个不同的计数?

How to use multiple count distinct in the same query with other columns in Druid SQL?

我正在尝试在 Druid 环境中像下面这样在同一个查询中使用三个投影:

select
  __time,
  count(distinct col1),
  count(distinct case when (condition1 and condition2 then (concat(col2,TIME_FORMAT(__time))) else 0 end )
from table
where condition3
GROUP BY __time

但我收到一条错误消息 - 未知异常/无法为查询构建计划

当我在查询中只输入一个 count(distinct) 时,它似乎工作得很好。

如何解决?

正如 Druid documentation 指出的那样:

COUNT(DISTINCT expr) Counts distinct values of expr, which can be string, numeric, or hyperUnique. By default this is approximate, using a variant of HyperLogLog. To get exact counts set "useApproximateCountDistinct" to "false". If you do this, expr must be string or numeric, since exact counts are not possible using hyperUnique columns. See also APPROX_COUNT_DISTINCT(expr). In exact mode, only one distinct count per query is permitted.

所以这是 Druid 的一个限制:您要么需要禁用精确模式,要么将自己限制为每次查询一个不同的计数。

附带说明一下,其他数据库通常没有此限制。 Apache Druid 专为高性能实时分析而设计,因此,其 SQL 的实现有一些限制。在内部,Druid 使用基于 JSON 的查询语言。 SQL 接口由基于 Apache Calcitea 的解析器和规划器提供支持,它将 SQL 转换为原生 Druid 查询。

作为解决方法,您可以执行多个子查询并将它们连接起来。类似于:

SELECT x.__time, x.delete_cnt, y.added_cnt 
FROM
(
SELECT FLOOR(__time to HOUR) __time, count(distinct deleted) delete_cnt
FROM wikipedia
GROUP BY 1
)x
JOIN
(
SELECT FLOOR(__time to HOUR) __time, count( distinct added) added_cnt
FROM wikipedia
GROUP BY 1
)y ON x.__time = y.__time