大規模分析を支えるHyperLogLog++〜分析編〜
データ基盤ひとりAdventCalendarの8日目の記事になります。
データ基盤に関連した内容について学んだことを@takegue がまとめていきます。

内容については随時加筆/修正等を行なっていく予定です。
修正等の指摘ありましたらご連絡いただけると幸いです。

分析におけるHyperLoglogの利用


膨大なレコードがあった場合、稀に発生するレコードの影響が問題になりますが
HLLを使うことで低コストで異なり数を求められることができるため集計の際のレコード重複影響を排除することもできます。(一方で数値は近似になるため検出には利用できないですが)

HyperLogLogの有用な性質は、その空間効率 log(log(n))もさることながら
途中計算をシリアライズし保存し、複数の途中計算結果を統合し計算することが可能になります。
このシリアライズされたものをSketchと呼びます。

分析用とのファクトテーブル保存方法として、これを保持しておくことでレコード数の圧縮や計算資源の節約に繋がります。

BigQueryではAPPROX_COUNT_DISTINCT関数だけでなく、このSketch操作をHLL_COUNT関数で提供を行なっています。
これをうまく使うことで、例えば以下のような操作を簡潔に求めることができます。

  • ユニークユーザ数の移動平均 (count distinctと分析関数の併用)の算出
  • 日毎のユニークユーザ数のスケッチから月ごとのユニークユーザ数の算出
  • ページごとのユニークユーザ数からサービス全体のユニークユーザの算出



この2種類の事前計算さえあれば大抵の分析ができることになります。

リクエスト数を求める

日時ユーザ数から月次ユーザ数を求める

ユーザ数の移動平均を求める

ユーザ数の継続率を求める