我已从Hive将数据加载到Druid中,并且未使用任何HLL列。
当我在Druid中运行COUNT(DISTINCT mycol)
查询时,我没有得到准确的计数。计数似乎是接近的,但与我在Hive中的计数不匹配。
即使我没有提到HLL的原因,为什么Druid不能给出确切的计数?另外,有没有办法在德鲁伊中获得精确的计数差异?
找到了2014年关于同一问题https://groups.google.com/forum/#!topic/druid-development/AMSOVGx5PhQ的旧帖子,不确定当前的Druid版本是否支持精确的计数差异。
答案 0 :(得分:1)
在没有DDL和更多线索的情况下很难说出正在发生什么... 我猜是由Druid索引时数据汇总了。当您使用非粒度的索引编制数据时,它可以汇总到粒度级别。
答案 1 :(得分:0)
默认情况下,COUNT(DISTINCT col)聚合函数使用HyperLogLog的变体,它是一种快速的近似非重复计数算法。如果通过查询上下文或通过代理配置将“ useroximateCountDistinct”设置为“ false”,则Druid SQL将切换为精确的非重复计数(请参阅http://druid.io/docs/latest/querying/sql.html)
要获取实际的非重复计数,请将druid.sql.planner.useroximatedCountDistinct设置为false。 (请参阅http://druid.io/docs/latest/configuration/index.html#broker-node-configs)另外请注意,精确模式有限制,每个查询只允许一个不同的计数。
答案 2 :(得分:0)
我有类似的问题,就我而言,这是由于Slim在他的回答中提到的数据汇总。
基本上,如果您的数据比 segmentGranularity 更为精细,则它将自动汇总。如果将 segmentGranularity 设置为无,则不会汇总。
在我的情况下,我观察到的另一件事是,即使我具有段粒度,但无,但是如果我的时间戳和两行不同的所有其他列相同,那么它将自动合并为1行。
这种特殊的行为对我来说还可以,因为我也在寻找与您一样的独特计数。