

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Hyperloglog 函數
<a name="hyperloglog-functions"></a>

SQL 中的 HyperLogLog (HLL) 函數提供一種方式，可有效估計大型資料集中唯一元素 （基數） 的數量，即使未儲存一組實際的唯一元素也一樣。

使用 HLL 函數的主要優點如下：
+ **記憶體效率**：HLL 草圖比儲存整組唯一元素需要的記憶體要少得多，因此適合大型資料集。
+ **分散式運算**：HLL 草圖可以跨多個資料來源或處理節點組合，從而實現高效的分散式唯一計數估算。
+ **近似結果**：HLL 提供近似的唯一計數估算，在準確度和記憶體用量之間進行調整權衡 （透過精確度參數）。

這些函數在您需要估計唯一項目數量的情況下特別有用，例如分析、資料倉儲和即時串流處理應用程式。

AWS Clean Rooms 支援下列 HLL 函數。

**Topics**
+ [HLL\$1SKETCH\$1AGG 函數](HLL_SKETCH_AGG.md)
+ [HLL\$1SKETCH\$1ESTIMATE 函數](HLL_SKETCH_ESTIMATE.md)
+ [HLL\$1UNION 函數](HLL_UNION.md)
+ [HLL\$1UNION\$1AGG 函數](HLL_UNION_AGG.md)

# HLL\$1SKETCH\$1AGG 函數
<a name="HLL_SKETCH_AGG"></a>

HLL\$1SKETCH\$1AGG 彙總函數會從指定欄中的值建立 HLL 草圖。它會傳回封裝輸入表達式值的 HLLSKETCH 資料類型。

HLL\$1SKETCH\$1AGG 彙總函數適用於任何資料類型，並忽略 NULL 值。

如果表格中沒有列或所有列都為 NULL，則產生的草圖沒有索引-值對，例如 `{"version":1,"logm":15,"sparse":{"indices":[],"values":[]}}`。

## 語法
<a name="HLL_SKETCH_AGG-synopsis"></a>

```
HLL_SKETCH_AGG (aggregate_expression[, lgConfigK ] )
```

## 引數
<a name="HLL_SKETCH_AGG-argument"></a>

 *aggregate\$1expression*   
任何類型 INT、BIGINT、STRING 或 BINARY 的表達式，其將發生唯一計數。會忽略任何`NULL`值。

*lgConfigK*  
選用的 INT 常數，介於 4 到 21 之間，預設值為 12。K 的 log-base-2，其中 K 是草圖的儲存貯體或插槽數目。

## 傳回類型
<a name="HLL_SKETCH_AGG-return-type"></a>

HLL\$1SKETCH\$1AGG 函數會傳回非 Null BINARY 緩衝區，其中包含計算的 HyperLogLog 草圖，因為 會耗用和彙總彙總群組中的所有輸入值。

## 範例
<a name="HLL_SKETCH_AGG-examples"></a>

下列範例使用 HyperLogLog (HLL) 演算法來估計資料`col`欄中值的不同計數。`hll_sketch_agg(col, 12)` 函數會彙總 col 欄中的值，使用精確度 12 建立 HLL 草圖。然後，該`hll_sketch_estimate()`函數會用來根據產生的 HLL 草圖來估計不同的值計數。查詢的最終結果為 3，代表資料`col`欄中值的預估不同計數。在此情況下，不同的值為 1、2 和 3。

```
SELECT hll_sketch_estimate(hll_sketch_agg(col, 12))
    FROM VALUES (1), (1), (2), (2), (3) tab(col);
  3
```

下列範例也會使用 HLL 演算法來估算資料`col`欄中值的不同計數，但不會指定 HLL 草圖的精確度值。在這種情況下，它會使用預設精確度 14。`hll_sketch_agg(col)` 函數會取得資料`col`欄中的值，並建立 HyperLogLog (HLL) 草圖，這是可用來估計不同元素計數的精簡資料結構。`hll_sketch_estimate(hll_sketch_agg(col))` 函數會採用上一個步驟中建立的 HLL 草圖，並計算資料`col`欄中不同值計數的估計值。查詢的最終結果為 3，代表資料`col`欄中值的預估不同計數。在此情況下，不同的值為 1、2 和 3。

```
SELECT hll_sketch_estimate(hll_sketch_agg(col))
FROM VALUES (1), (1), (2), (2), (3) tab(col);
3
```

# HLL\$1SKETCH\$1ESTIMATE 函數
<a name="HLL_SKETCH_ESTIMATE"></a>

HLL\$1SKETCH\$1ESTIMATE 函數採用 HLL 草圖，並估計草圖所代表的唯一元素數量。它使用 HyperLogLog (HLL) 演算法來計算指定資料欄中唯一值數量的概率近似值，使用先前由 HLL\$1SKETCH\$1AGG 函數產生的草圖緩衝區二進位表示法，並將結果傳回為大整數。

HLL 素描演算法提供一種有效方法來估算唯一元素的數量，即使是大型資料集也一樣，而不必存放完整的一組唯一值。

`hll_union` 和 `hll_union_agg`函數也可以將這些緩衝區作為輸入耗用並合併，以將草圖結合在一起。

## 語法
<a name="HLL_SKETCH_ESTIMATE-synopsis"></a>

```
HLL_SKETCH_ESTIMATE (hllsketch_expression)
```

## 引數
<a name="HLL_SKETCH_ESTIMATE-argument"></a>

 *hllsketch\$1expression*   
保留 HLL\$1SKETCH\$1AGG 產生的草圖的`BINARY`表達式

## 傳回類型
<a name="HLL_SKETCH_ESTIMATE-return-type"></a>

HLL\$1SKETCH\$1ESTIMATE 函數會傳回 BIGINT 值，該值是輸入草圖表示的近似差異計數。

## 範例
<a name="HLL_SKETCH_ESTIMATE-examples"></a>

下列範例使用 HyperLogLog (HLL) 素描演算法來估計`col`資料欄中值的基數 （唯一計數）。`hll_sketch_agg(col, 12)` 函數會取得 `col`資料欄，並使用 12 位元的精確度建立 HLL 草圖。HLL 草圖是一種近似資料結構，可有效估計集合中唯一元素的數量。`hll_sketch_estimate()` 函數會採用由 建立的 HLL 草圖，`hll_sketch_agg`並預估草圖所代表值的基數 （唯一計數）。`FROM VALUES (1), (1), (2), (2), (3) tab(col);` 會產生具有 5 列的測試資料集，其中資料`col`欄包含值 1、1、2、2 和 3。此查詢的結果是資料`col`欄中值的估計唯一計數，即 3。

```
SELECT hll_sketch_estimate(hll_sketch_agg(col, 12))
    FROM VALUES (1), (1), (2), (2), (3) tab(col);
  3
```

下列範例和上一個範例之間的差異在於未在`hll_sketch_agg`函數呼叫中指定精確度參數 (12 位元）。在此情況下，會使用 14 位元的預設精確度，相較於先前使用 12 位元精確度的範例，這可提供更準確的唯一計數預估。

```
SELECT hll_sketch_estimate(hll_sketch_agg(col))
FROM VALUES (1), (1), (2), (2), (3) tab(col);
3
```

# HLL\$1UNION 函數
<a name="HLL_UNION"></a>

HLL\$1UNION 函數將兩個 HLL 草圖合併為單一的統一草圖。它使用 HyperLogLog (HLL) 演算法，將兩個草圖合併為單一草圖。查詢可以使用產生的緩衝區，以`hll_sketch_estimate`函數的長整數來計算近似的唯一計數。

## 語法
<a name="HLL_UNION-syntax"></a>

```
HLL_UNION (( expr1, expr2 [, allowDifferentLgConfigK ] ))
```

## 引數
<a name="HLL_UNION-argument"></a>

 *exprN*   
保留 HLL\$1SKETCH\$1AGG 產生的草圖的`BINARY`表達式。

*allowDifferentLgConfigK*  
選用的 BOOLEAN 表達式，可控制是否允許將兩個草圖與不同的 lgConfigK 值合併。預設值為 `false`。

## 傳回類型
<a name="HLL_UNION-return-type"></a>

HLL\$1UNION 函數會傳回 BINARY 緩衝區，其中包含因合併輸入表達式而計算的 HyperLogLog 草圖。當 `allowDifferentLgConfigK` 參數為 時`true`，結果草圖會使用兩個所提供`lgConfigK`值中較小的值。

## 範例
<a name="HLL_UNION-examples"></a>

下列範例使用 HyperLogLog (HLL) 素描演算法來估計資料集`col2`中兩欄 `col1`和 之間的唯一值計數。

 `hll_sketch_agg(col1)` 函數會為資料`col1`欄中的唯一值建立 HLL 草圖。

`hll_sketch_agg(col2)` 函數會為 col2 欄中的唯一值建立 HLL 草圖。

`hll_union(...)` 函數將步驟 1 和 2 中建立的兩個 HLL 草圖合併為單一、統一的 HLL 草圖。

`hll_sketch_estimate(...)` 函數會採用合併的 HLL 草圖，並預估 `col1`和 中值的唯一計數`col2`。

`FROM VALUES` 子句會產生一個包含 5 列的測試資料集，其中 `col1`包含值 1、1、2、2 和 3，而 `col2` 包含值 4、4、5、5 和 6。

此查詢的結果是跨 `col1`和 值的估計唯一計數`col2`，即 6。HLL 素描演算法提供一種有效方法來估算唯一元素的數量，即使是大型資料集也一樣，而不必存放完整的一組唯一值。在此範例中，`hll_union`函數會用來結合兩個資料欄的 HLL 草圖，這允許在整個資料集中估計唯一計數，而不只是針對每個資料欄個別估算。

```
SELECT hll_sketch_estimate(
  hll_union(
    hll_sketch_agg(col1),
    hll_sketch_agg(col2)))
  FROM VALUES
    (1, 4),
    (1, 4),
    (2, 5),
    (2, 5),
    (3, 6) AS tab(col1, col2);
  6
```

下列範例和上一個範例之間的差異在於未在`hll_sketch_agg`函數呼叫中指定精確度參數 (12 位元）。在此情況下，會使用 14 位元的預設精確度，相較於先前使用 12 位元精確度的範例，這可提供更準確的唯一計數預估。

```
SELECT hll_sketch_estimate(
  hll_union(
    hll_sketch_agg(col1, 14),
    hll_sketch_agg(col2, 14)))
  FROM VALUES
    (1, 4),
    (1, 4),
    (2, 5),
    (2, 5),
    (3, 6) AS tab(col1, col2);
```

# HLL\$1UNION\$1AGG 函數
<a name="HLL_UNION_AGG"></a>

HLL\$1UNION\$1AGG 函數將多個 HLL 草圖合併為單一的統一草圖。它使用 HyperLogLog (HLL) 演算法，將一組草圖合併為單一草圖。查詢可以使用產生的緩衝區，透過 `hll_sketch_estimate`函數計算近似的唯一計數。

## 語法
<a name="HLL_UNION_AGG-syntax"></a>

```
HLL_UNION_AGG ( expr [, allowDifferentLgConfigK ] )
```

## 引數
<a name="HLL_UNION_AGG-argument"></a>

 *expr*   
保留 HLL\$1SKETCH\$1AGG 產生的草圖的`BINARY`表達式。

*allowDifferentLgConfigK*  
選用的 BOOLEAN 表達式，可控制是否允許將兩個草圖與不同的 lgConfigK 值合併。預設值為 `false`。

## 傳回類型
<a name="HLL_UNION_AGG-return-type"></a>

HLL\$1UNION\$1AGG 函數會傳回 BINARY 緩衝區，其中包含 HyperLogLog 草圖，這是由於合併相同群組的輸入表達式所計算的結果。當 `allowDifferentLgConfigK` 參數為 時`true`，結果草圖會使用兩個所提供`lgConfigK`值中較小的值。

## 範例
<a name="HLL_UNION_AGG-examples"></a>

下列範例使用 HyperLogLog (HLL) 草圖演算法來估計多個 HLL 草圖中值的唯一計數。

第一個範例預估資料集中值的唯一計數。

```
SELECT hll_sketch_estimate(hll_union_agg(sketch, true))
    FROM (SELECT hll_sketch_agg(col) as sketch
            FROM VALUES (1) AS tab(col)
          UNION ALL
          SELECT hll_sketch_agg(col, 20) as sketch
            FROM VALUES (1) AS tab(col));
  1
```

內部查詢會建立兩個 HLL 草圖：
+ 第一個 SELECT 陳述式會從單一值 1 建立草圖。
+ 第二個 SELECT 陳述式會從另一個單一值 1 建立草圖，但精確度為 20。

外部查詢使用 HLL\$1UNION\$1AGG 函數，將兩個草圖合併為單一草圖。然後，它會將 HLL\$1SKETCH\$1ESTIMATE 函數套用到此合併草圖，以估算值的唯一計數。

此查詢的結果是資料`col`欄中值的估計唯一計數，即 `1`。這表示 1 的兩個輸入值被視為唯一，即使它們具有相同的值。

第二個範例包含 HLL\$1UNION\$1AGG 函數的不同精確度參數。在這種情況下，兩個 HLL 草圖都是以 14 位元的精確度建立，這可讓它們成功`hll_union_agg`與 `true` 參數搭配使用。

```
SELECT hll_sketch_estimate(hll_union_agg(sketch, true))
    FROM (SELECT hll_sketch_agg(col, 14) as sketch
            FROM VALUES (1) AS tab(col)
          UNION ALL
          SELECT hll_sketch_agg(col, 14) as sketch
            FROM VALUES (1) AS tab(col));
  1
```

查詢的最終結果是估計的唯一計數，在這種情況下，它也是 `1`。這表示 1 的兩個輸入值被視為唯一，即使它們具有相同的值。