类别:

聚合函数 (基数估算)、窗口函数

DATASKETCHES_HLL

返回输入的非重复基数的近似值(即 DATASKETCHES_HLL(col1) 返回 COUNT(DISTINCT col1) 的近似值)。

此函数是 HLL HyperLogLog 函数的一个版本,可以读取 Apache DataSketches 使用的格式的二进制草图。有关更多信息,请参阅 Apache DataSketches 文档 (https://datasketches.apache.org/docs/HLL/HllSketches.html)。

另请参阅:

DATASKETCHES_HLL_ACCUMULATEDATASKETCHES_HLL_COMBINEDATASKETCHES_HLL_ESTIMATE

语法

聚合函数

DATASKETCHES_HLL( [ DISTINCT ] <expr1> [ , <max_log_k> ] )
Copy

窗口函数

DATASKETCHES_HLL( [ DISTINCT ] <expr1> [ , <max_log_k> ] )
  OVER ( [ PARTITION BY <expr2> ] )
Copy

必填实参

expr1

用于了解非重复值数量的表达式。

可选实参

max_log_k

初始化数据草图 HLL 对象的 K 的最大值,以 log2 表示。指定一个介于 4 和 21(含)之间的 INTEGER 值。有关更多信息,请参阅 Apache DataSketches 文档 (https://datasketches.apache.org/docs/HLL/HllSketches.html)。

默认值:12

expr2

可选表达式,用于将行分组到分区。

返回

该函数返回 DOUBLE 类型的值。

如果输入为空,则输出为 0.0

使用说明

  • DISTINCT 在语法上受支持,但不起作用。

  • 该函数支持的实参是以下数据类型的值:

    • :doc:`/sql-reference/data-types-text`(例如 VARCHAR 和 BINARY)。

      例如,支持以下函数调用:

      SELECT DATASKETCHES_HLL_ACCUMULATE(1::TEXT);
      
      Copy
      SELECT DATASKETCHES_HLL_ACCUMULATE(TO_BINARY(HEX_ENCODE(1), 'HEX'));
      
      Copy
    • :ref:`label-data_types_for_floating_point_numbers`(例如 FLOAT 和 DOUBLE)

      DataSketches 库将这些值的类型强制转换为 DOUBLE 值。

    • :ref:`label-data_types_for_fixed_point_numbers`(例如 INTEGER 和 NUMERIC)。

      该函数仅支持小数位数为 0 的数字类型。但是,您可以将小数位数不为 0 的数值转换为浮点数的数据类型。

      DataSketches 库会将 64 位带符号 INTEGER 范围内的这些值转换为 64 位带符号的 INTEGER 值。

      DataSketches 库不会直接转换超过 64 位带符号 INTEGER 范围的 INTEGER 值(例如 128 位整数值)。但是,Snowflake 仍然通过自动将这些值转换为 DataSketches 支持的 DOUBLE 值来支持这些值。此行为与 datasketches-python 库的行为相同。

    不支持其他数据类型的值。例如,不支持 VARIANT 和 ARRAY 值。

  • 有关 NULL 值和聚合函数的信息,请参阅 聚合函数和 NULL 值

  • 当此函数作为窗口函数调用时,它不支持:

    • OVER 子句中的 ORDER BY 子句。

    • 显式窗口框架。

示例

创建表并插入值:

CREATE OR REPLACE TABLE datasketches_demo(v INT, g INT);

INSERT INTO datasketches_demo SELECT 1, 1;
INSERT INTO datasketches_demo SELECT 2, 1;
INSERT INTO datasketches_demo SELECT 2, 1;
INSERT INTO datasketches_demo SELECT 2, 1;
INSERT INTO datasketches_demo SELECT 1, 2;
INSERT INTO datasketches_demo SELECT 1, 2;
INSERT INTO datasketches_demo SELECT 4, 2;
INSERT INTO datasketches_demo SELECT 4, 2;
INSERT INTO datasketches_demo SELECT 5, 2;
Copy

以下示例使用表中的数据:

返回列中分组数据的预估基数

使用 DATASKETCHES_HLL 函数近似计算按列 g 中的值分组的列 v 中数据的不同基数。

SELECT g,
       DATASKETCHES_HLL(v),
       COUNT(DISTINCT v)
  FROM datasketches_demo GROUP BY g;
Copy
+---+---------------------+-------------------+
| G | DATASKETCHES_HLL(V) | COUNT(DISTINCT V) |
|---+---------------------+-------------------|
| 1 |         2.000000005 |                 2 |
| 2 |         3.000000015 |                 3 |
+---+---------------------+-------------------+

输出显示,对于列 g 中的值 1,列 v 中大约有两个不同的值(即 12)。对于列 g 中的值 2,列 v 中大约有三个不同的值(即 145)。COUNT(DISTINCT v)) 调用返回的是不同值的确切数量,而非估计值。

如果您使用 DATASKETCHES_HLL_ACCUMULATE 函数根据分组数据创建二进制草图,则 DATASKETCHES_HLL_ESTIMATE 函数会为累积的草图返回相同的结果。有关示例,请参阅 返回累积二进制草图的基数估计值

返回列中所有数据的预估基数

使用 DATASKETCHES_HLL 函数近似计算列 v 中所有数据的不同基数。

SELECT DATASKETCHES_HLL(v),
       COUNT(DISTINCT v)
  FROM datasketches_demo;
Copy
+---------------------+-------------------+
| DATASKETCHES_HLL(V) | COUNT(DISTINCT V) |
|---------------------+-------------------|
|          4.00000003 |                 4 |
+---------------------+-------------------+

输出显示,列 v 中大约有四个不同的值(即 1245)。COUNT(DISTINCT v)) 调用返回的是不同值的确切数量,而非估计值。

如果您使用 DATASKETCHES_HLL_ACCUMULATE 函数根据分组的数据创建二进制草图,然后使用 DATASKETCHES_HLL_COMBINE 函数将这些草图组合成一个统一的草图,则 DATASKETCHES_HLL_ESTIMATE 函数将为统一的草图返回相同的结果。有关示例,请参阅 返回组合二进制草图的基数估计值

语言: 中文