我在从Theta Sketch DataSketches模块获取正确的不同计数编号时遇到问题。
我正在使用的摄入规格看起来像这样
"granularitySpec" :
{
"type" : "uniform",
"segmentGranularity" : "HOUR",
"queryGranularity" : "HOUR",
"intervals": ["${hourToProcess.intervalFormat}"]
}
..........
"dimensionsSpec" :
{
"dimensions" : [
"dimension1",
"dimension2",
......
"dimensionN"
]
}
..........
"timestampSpec" :
{
"format" : "${hourToProcess.ingestionDateFormat}",
"column" : "eventTimestamp"
}
..........
"metricsSpecs" :
[
.........,
{"type": "thetaSketch", "name": "uniqueUsers", "fieldName": "uniqueUsers"}
........
]
字段uniqueUsers
是一个字符串。
如果我以以下方式查询Druid而不进行任何过滤或分组操作
{
"type" : "thetaSketch",
"fieldName" : "uniqueUsers",
"isInputThetaSketch": true
}
结果正确。但是,如果我进行任何类型的过滤或按维度分组
"filter": {
"type": "selector",
"dimension": "dimensionX",
"value": "1"
}
结果远高于预期值。
Theta Sketch内部或我的配置有问题吗?
我还想补充一点,如果我使用DataSketches HLL而不是ThetaSketch,则会得到更好的结果。
答案 0 :(得分:0)
由于ThetaSketch支持基于集合的操作(联合,相交,差值),因此您需要在查询中指定过滤器,聚合和postAggregations部分。这些部分对于计算正确的结果至关重要。我认为,筛选器部分最为关键,因为它定义了将在postAggregations部分中合并的维度和值。
以下Druid文档非常有帮助。但是,他们的示例是groupBy查询。我相信他们的示例假设数据为原始格式,并且需要在查询时计算ThetaSketch。就您而言,您的草图已经在摄取时进行了预先计算,因此,时间序列查询会更快。
https://druid.apache.org/docs/latest/development/extensions-core/datasketches-theta.html
希望有帮助。