Cardinality/HyperUnique聚合器

Cardinality聚合器

计算一组Apache Druid维度的Cardinality, 使用的是HyperLogLog来估计的Cardinality。 请注意:该聚合器比HyperUnique聚合器慢的多。 该聚合器运行在维度列上,这意味着和无法从数据集中移除掉字符串维度以改进Rollup。 通常,如果你不关注维度列的单个值,我们强烈推荐使用HyperUnique聚合器,而非Cardinality聚合器。

{
  "type": "cardinality",
  "name": "<output_name>",
  "fields": [ <dimension1>, <dimension2>, ... ],
  "byRow": <false | true> # (optional, defaults to false),
  "round": <false | true> # (optional, defaults to false)
}

fields字段中的每一个单独的元素都是一个字符串或者DimensionSpecfields列表中的一个字符串维度等价于DefaultDimensionSpec

HyperLogLog算法生成十进制估计,但存在一定误差。round可以设置为true,以将估计值舍入为整数。请注意,即使使用round,基数仍然是一个估计值。round字段仅影响查询时行为,在摄取时被忽略。

Cardinality by value

当将byRow设置为false时(即默认值), 它计算由所有给定维度的所有维度值的并集组成的集合的基数。

  • 对于单一维度,等价于
SELECT COUNT(DISTINCT(dimension)) FROM <datasource>
  • 对于多列维度,等价于
SELECT COUNT(DISTINCT(value)) FROM (
  SELECT dim_1 as value FROM <datasource>
  UNION
  SELECT dim_2 as value FROM <datasource>
  UNION
  SELECT dim_3 as value FROM <datasource>
)

Cardinality by row

当将byRow设置为true时, 它按行计算基数,即不同维度组合的基数。等价于

SELECT COUNT(*) FROM ( SELECT DIM1, DIM2, DIM3 FROM <datasource> GROUP BY DIM1, DIM2, DIM3 )

三个例子

  • 计算人们居住或来自的不同国家的数量
{
  "type": "cardinality",
  "name": "distinct_countries",
  "fields": [ "country_of_origin", "country_of_residence" ]
}
  • 计算不同人员的数量(即姓名和姓氏的组合)
{
  "type": "cardinality",
  "name": "distinct_people",
  "fields": [ "first_name", "last_name" ],
  "byRow" : true
}
  • 计算姓氏的不同起始字符数
{
  "type": "cardinality",
  "name": "distinct_last_name_first_char",
  "fields": [
    {
     "type" : "extraction",
     "dimension" : "last_name",
     "outputName" :  "last_name_first_char",
     "extractionFn" : { "type" : "substring", "index" : 0, "length" : 1 }
    }
  ],
  "byRow" : true
}

HyperUnique聚合器

使用HyperLogLog计算在摄入数据时已聚合为“HyperUnique”度量的维度的估算基数。

{
  "type" : "hyperUnique",
  "name" : <output_name>,
  "fieldName" : <metric_name>,
  "isInputHyperUnique" : false,
  "round" : false
}

isInputHyperUnique参数可以设置为true用来索引预计算的HLL。 isInputHyperUnique参数仅仅只影响摄入阶段的行为,在查询时被忽略

HyperLogLog算法生成十进制估计,但存在一定误差。round可以设置为true,以将估计值舍入为整数。请注意,即使使用round,基数仍然是一个估计值。round字段仅影响查询时行为,在摄取时被忽略。

渝ICP备16001958号 | Copyright © 2020 apache-druid.cn All right reserved,powered by Gitbook最近一次修改时间: 2021-11-17 15:22:04

results matching ""

    No results matching ""