我已经从Hive将数据加载到Druid,但我没有使用任何hll列。
当我运行一个 COUNT(DISTINCT mycol)
在Druid查询,我没有得到确切的计数。计数似乎很接近,但与我在Hive里的不匹配。
为什么Druid不能给出一个确切的计数,即使我没有提到任何关于hll?或者,有没有一种方法可以得到Druid的精确计数?
找到了一篇2014年关于同一问题的老帖子https://groups.google.com/forum/#!topic/druid development/amsovgx5phq,我不确定当前版本的druid是否支持精确计数distincts。
3条答案
按热度按时间qfe3c7zg1#
默认情况下,count(distinct col)聚合函数使用hyperloglog的一个变体,hyperloglog是一种快速近似的distinct计数算法。如果通过查询上下文或代理配置将“useapproximatecountdistinct”设置为“false”,DruidSQL将切换到精确的不同计数http://druid.io/docs/latest/querying/sql.html )
要获取实际的不同计数,请将druid.sql.planner.useapproximatecountdistinct设置为false。(参考http://druid.io/docs/latest/configuration/index.html#broker-节点配置)还请注意,在精确模式下有限制,每个查询只允许一个不同的计数。
2jcobegt2#
我有类似的问题,在我的情况下,这是因为数据汇总斯利姆在他的回答中提到。
基本上,如果您的数据比您的数据粒度更细粒度,那么它将自动汇总。如果您将segmentgranularity设置为none,那么它就不会卷起来。
在我的例子中我观察到的另一件事是,即使我没有段粒度,但是如果我的时间戳和两个不同行的所有其他列相同,那么它会自动合并到一行中。
这种特殊的行为对我来说是可以的,因为我也像你一样寻找不同的计数。
ny6fqffe3#
如果没有DDL和更多的线索很难判断发生了什么。。。我猜数据是在被Druid索引时收集起来的。当您使用非“无”粒度索引数据时,它可以上卷到粒度级别。