Minhaz Kazi,Google Analytics(分析)开发技术推广工程师 - 2022 年 10 月
针对大型数据集衡量确切的非重复计数(即基数)需要大量内存且会影响性能。Google Analytics(分析)4 媒体资源使用 HyperLogLog++ (HLL++) 算法来估算最常用指标的基数,包括活跃用户数和会话数指标。例如,在 Google Analytics(分析)界面中以及通过 Data API 查看“活跃用户数”时,看到的将是近似值。针对这些指标使用 HLL++ 可确保实现较高的性能,同时提高估算准确性并缩小误差范围。本博文详细介绍了如何在 Google Analytics(分析)4 媒体资源中使用 HLL++,以及如何复制部分使用 BigQuery 事件导出数据的估算值。
关于 HLL++
HLL++ 可估算基数,同时减少内存占用并提升性能。HLL++ 在 HyperLogLog 算法的基础上得到了增强,基于 HyperLogLog 实践:一种先进的基数估算算法的算法工程。HLL++ precision
参数发生了变化,会在所计算统计数据的内存用量与准确性之间进行权衡。增加参数值可以减少误差,但会增加内存消耗。
BigQuery 中的唯一计数实现
- 使用
COUNT(DISTINCT)
可衡量确切的基数。此方法需要较多内存和较长的运行时间,尤其是对于大型数据集。 APPROX_COUNT_DISTINCT
使用 HLL++ 计算结果的近似值。但是,APPROX_COUNT_DISTINCT
不允许用户配置近似值的准确度。- 如需使用自定义
precision
值,请使用 HyperLogLog++ 函数。如需了解允许的precision
值和典型精确度的置信区间,请参阅 HLL++ 草图。 sparse precision
是 HLL+ 的另一个参数。在 BigQuery 中,sparse precision
值不可由用户定义,固定为precision + 5
。
Google Analytics(分析)4 媒体资源中的 HLL++ 实现
Google Analytics(分析)4 使用以下配置来衡量相关指标的基数。
指标 | precision |
sparse precision |
---|---|---|
会话数 | 12 | 17 |
活跃用户数 | 14 | 25 |
用户总数 | 14 | 25 |
将 BigQuery HLL++ 函数与 Google Analytics(分析)事件数据结合使用
如果 BigQuery 中有您 Google Analytics(分析)4 媒体资源的事件数据,您可以尝试将 Google Analytics(分析)界面中的指标与 BigQuery 数据进行匹配。以下示例做出了如下假设:
- 对于 Google Analytics(分析)4 媒体资源,报告标识符设置为
By device only
。 - 其他可能的差异来源(例如报告时区)已解决。
用户总数
使用 COUNT(DISTINCT)
计算确切计数:
SELECT
COUNT(DISTINCT user_pseudo_id) AS exact_total_user_count,
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
使用 APPROX_COUNT_DISTINCT
得出近似计数:
SELECT
APPROX_COUNT_DISTINCT(user_pseudo_id) AS approx_total_user_count,
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
您可以使用 BigQuery HLL++ 函数复制 APPROX_COUNT_DISTINCT
。这将与 APPROX_COUNT_DISTINCT
返回相同或非常相似的结果:
SELECT
HLL_COUNT.EXTRACT(HLL_COUNT.INIT(user_pseudo_id, 15)) AS approx_total_user_count,
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
最后,如要在 Google Analytics(分析)界面中复制数据,请使用 precision = 14
:
SELECT
HLL_COUNT.EXTRACT(HLL_COUNT.INIT(user_pseudo_id, 14)) AS total_user_count,
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
活跃用户数
如要通过 BigQuery 事件导出表格计算活跃用户数,您首先需要对事件进行过滤,才能使系统仅显示活跃用户数。如何实现活跃用户数过滤器不在本文的讨论范围内。
WITH ActiveUsers AS
(
SELECT
user_pseudo_id
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE
<implement active user filter logic>
)
SELECT
HLL_COUNT.EXTRACT(HLL_COUNT.INIT(user_pseudo_id, 14)) AS active_user_count,
FROM ActiveUsers
会话数
ga_session_id
事件参数用于标识每个用户的唯一会话数。user_pseudo_id
和 ga_session_id
的组合在数据集内对唯一会话来说将是唯一的。这是 Google Analytics(分析)4 媒体资源统计会话数的标准方法。对于会话数,precision
为 12。
SELECT
HLL_COUNT.EXTRACT(
HLL_COUNT.INIT(
CONCAT(
user_pseudo_id,
(SELECT `value` FROM UNNEST(event_params) WHERE key = 'ga_session_id' LIMIT 1).int_value),
12)) AS session_count,
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
您可以将本博文中的查询与基本查询和高级查询示例配合使用,以更详细地了解 Google Analytics(分析)4 媒体资源的 BigQuery 事件导出数据。如果您的媒体资源会生成大量事件数据,您还可以实现 HLL++ 函数来估算 BigQuery 查询中常用的其他指标的基数。如需详细了解 HLL++ 以及为什么大型数据集中的基数计算开销较高,请参阅 Cloud 博客上的深度博文:使用 HLL++ 加速衡量大型数据集中的唯一计数。