標準 SQL の近似集計

このトピックでは、BigQuery での近似集計に関する概念について説明します。

近似集計とは

近似集計は、カーディナリティや変位値などの集計関数出力の見積もりです。近似集計では、COUNT(DISTINCT ...) のような通常の集計関数よりも必要なメモリが少なくなりますが、統計的不確実性も生じます。これは、現時点で概算であるデータに加えて、線形メモリの使用が実用的でない大規模なデータ ストリームにも適しています。正確な結果が必要な場合は、正確な集計関数を使用します。このトピックでは、BigQuery での近似集計に関する概念について説明します。

固定精度近似集計

BigQuery では、カーディナリティと変位値を推測する固定精度の集計関数がサポートされています。これらの関数は、データの中間的な推測ではなく、入力データに対して直接作用します。これらの関数では、ユーザーが推測の精度を指定することはできません。

推測された集計値のスケッチとしての保存

BigQuery は、大規模なデータセット内の個別の値の数を推測する HyperLogLog++ カーディナリティ推測関数をサポートしています。

これらの関数は、任意のセットを固定のメモリ表現に圧縮したスケッチを操作します。BigQuery では、これらのスケッチが BYTES として保存されます。スケッチから最終的な数値の推測を導出する前に、スケッチを統合して新しいスケッチを生成し、入力スケッチの結合を表すことができます。

次のテーブルについて考えてみます。このテーブルには、アイスクリームのフレーバーとそのフレーバーを好むとした人の数が含まれています。

Flavor People
Vanilla 3,945
Chocolate 1,728
Strawberry 2,051

このテーブルが集計の結果である場合は、このテーブルを使用してカーディナリティを計算することはできません。個別回答者の実質数を知る必要がある場合、SUM を使用して People 列を集計することはできません。これは、回答者の中に複数のフレーバーを選択した人もいる可能性があるためです。一方、基礎となる加工前の元データに対して集計関数を実行すると、大量のメモリが消費されて非常に時間がかかる可能性があります。

解決策の 1 つは、加工前の元データの近似集計、つまりスケッチを保存することです。スケッチは、加工前の元データの要約です。スケッチでは加工前の元データよりメモリ所要量が少なくなり、スケッチから個別ユーザーの推定数などの推測を導出できます。

近似精度の指定

BigQuery のスケッチベースの近似集計関数を使用すると、スケッチの作成時にスケッチの精度を指定できます。スケッチの精度は、スケッチから導出できる推測の精度に影響します。精度が高いほど、スケッチを処理したり、ディスクに保存したりするための追加のメモリが必要になり、スケッチから導出した推測の相対誤差が小さくなります。スケッチを作成したら、同じ精度の他のスケッチのみと統合できます。

スケッチの統合

2 つ以上のスケッチを統合して、異なるスケッチの基礎となるデータの結合の推測を表す新しいスケッチを生成することができます。HLL_COUNT.MERGE などの統合関数では推測が数値として返されますが、HLL_COUNT.MERGE_PARTIAL などの部分的な統合関数では BYTES で新しいスケッチが返されます。部分的な統合は、すでにスケッチが含まれているテーブルを縮小する必要があるが、まだ推測を導出しない場合に便利です。たとえば、後で別のスケッチと統合するスケッチを作成する場合は、この関数を使用します。

スケッチからの推測の導出

スケッチを保存した場合、または 2 つ以上のスケッチを新しいスケッチに統合した場合は、HLL_COUNT.EXTRACT などの導出関数を使用して、一意のユーザーの推定数など、基礎となるデータの推測を数値として返すことができます。

アルゴリズム

このセクションでは、BigQuery がサポートする近似集計アルゴリズムについて説明します。

HyperLogLog++

HyperLogLog++ アルゴリズムは、データセット内の個別値を推測できるように HyperLogLog アルゴリズムを改良したものです。BigQuery では、HyperLogLog++ カーディナリティ推測関数がこのアルゴリズムを使用します。HyperLogLog++ アルゴリズムは、バイアス補正を使用してカーディナリティの重要な範囲のエラーを減らすことで、HyperLogLog アルゴリズムから改善されています。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。