您可以通过APPROX_COUNT_DISTINCT(近似Count Distinct)优化提升作业性能。
背景信息
Count Distinct优化时,Aggregate节点的State需要保存所有Distinct Key信息。当Distinct Key数目过大时,State的读写开销太大,因此Count
Distinct优化存在的性能瓶颈。但在很多场景,完全精确的统计并不那么必要。如果您希望牺牲部分精确度来换取性能上的提升,您可以使用新增的内置函数APPROX_COUNT_DISTINCT提升作业性能。APPROX_COUNT_DISTINCT支持MiniBatch或Local-Global等Aggregate上的优化,但是需要注意以下几点:
- 输入不含有撤回消息。
- Distinct Key数目需要足够大,例如UV。如果Distinct Key数目不大,APPROX_COUNT_DISTINCT性能相对精确计算提升不大。
调优方式
SQL中直接使用APPROX_COUNT_DISTINCT(user)代替COUNT(DISTINCT user)。APPROX_COUNT_DISTINCT(user)语法格式如下。
APPROX_COUNT_DISTINCT(col [, accuracy])
其中:- col:字段名称,任意类型。
- accuracy:指定准确率,可选,取值范围为(0.0, 1.0),默认值为0.99,取值越高,准确率越高,state开销越大,性能越低。
示例
- 测试数据
a (VARCHAR) c (BIGINT) Hi 1 Hi 2 Hi 3 Hi 4 Hi 5 Hi 6 - 测试代码
SELECT a, APPROX_COUNT_DISTINCT(b) as b, APPROX_COUNT_DISTINCT(b, 0.9) as c FROM MyTable GROUP BY a;
- 测试结果
a (VARCHAR) b (BIGINT) c (BIGINT) Hi 5 5