ComputeColStats UDF中 近似算法的介绍

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 一,前面的话 表和列的统计信息对CBO的结果有着极大地影响,能够高效和准确的收集统计信息是极其重要的。但高效和准确是矛盾的,更准确的统计信息往往需要更多的计算,我们能做的是在高效和准确之间找到更好的平衡。

一,前面的话

表和列的统计信息对CBO的结果有着极大地影响,能够高效和准确的收集统计信息是极其重要的。但高效和准确是矛盾的,更准确的统计信息往往需要更多的计算,我们能做的是在高效和准确之间找到更好的平衡。接下来的内容是关于目前在ComputeColStats中用的一些近似算法。

二,收集的内容

目前针对列主要会收集以下统计信息:
cntRows : 列中总数据个数,包括nulll值
avgColLen :列的平均长度
maxColLEN :列的最大长度
minValue :列的最小值
maxValue :列的最大值
numNulls :列中null值个数
numFalses :如果boolean型,false值的个数
numTrues :如果boolean型,true值的个数
countDistinct :不同值的个数
topK :topk值的个数,数据倾斜的标志
一般说来除了countDistinct 和topK 以外的统计信息基本上消耗资源并不大(minValue和maxValue存在大量比较,也会消耗不少资源),问题主要集中在countDistinct 和topK上。下面要描述的近似算法也是主要针对这两个点。

三,countDistinct 实现

算法:Flajolet-Martin
论文见:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.81.3869&rep=rep1&type=pdf
简介
对于n个object,如果Hash结果中,结尾(或开头)连续0的长度的最大值是m,那么,可以估计唯一的object的数据量是2^m个。
假设有一个非常好的hash函数,能够将object哈希成一个二进制数0101……,并且非常均匀的打散到二进制空间。如果有8个唯一的object,将它们全部Hash之后,结果按照概率应该有4个object的Hash值以0结尾,这4个Hash值又应该有2个结尾是00,这2个中又有1个结尾是000。
采用多个独立的hash函数,每个hash函数分别计算最长0比特序列,然后求平均值,减少误差。
hash函数的个数基本上就决定了Flajolet-Martin算法的效率和准确度,后面有针对不同hash函数个数的测试结果。

四,topK实现

算法:Space-Saving
伪代码:
a01

五,基本性能测试

a02
结论:
1,Base Stats对性能也是存在影响的,主要是minValue和maxValue的计算,尤其是collen较长的情况下
2,一般说来distinct相对topK会更慢些,除非在collen较长的时候,topK也是基于比较来的
3,随着列个数的增加,收集stats消耗的时间也线性的增加
4,distinct的计算基于hash,而topK的计算基于比较,所以前者对collen并不敏感

六,不同hash函数个数执行效率的测试

a03
结论:
基本上随着hash函数个数的增加线性的增长

七,不同hash函数个数准确性的测试

a04
结论:
hash函数个数增加到32个后,准确率基本能满足需求

八,不同hash函数个数的测试总结

a05
结论:选择32个hash函数计算distinct,平衡执行效率及准确性

九,sample算法的选择

1,必要性:
基于前面对执行效率的测试,为了避免对任务产生过大的影响,Sample是一定要做的
2,Sample算法的要求:
效率,随机
3,Sample的选择:
采用buildin的sample函数实现
前提是假设数据分布是随机的
4,Sample的影响:
对某些stats基本没影响,比如说avgColLen,maxColLen,minValue,maxValue
对某些stats有些影响,比如说cntRows, numNulls,numFalses,numTrues,topK
对countDistinct影响比较大,并且countDistinct也更加重要,需要特别注意
5,Sample后countDistinct的处理:
根据Sample的countDistinct预测完整数据的countDistinct,采样,拟合

基本思路如下图:
a06
希望通过对sample内的数据进行采样,利用这些采样点描绘全部数据的形态,达到基本准确预测全部数据distinct的结果。这是个美好的愿望,在sample的数据相对较少的时候,总有些情况下sample下的形态跟完整数据的形态存在较大的差异,此时的误差会比较大。

十,不同sample比例执行效率的测试

a07
采样比例在1/100后执行时间差距不大,此时最大的消耗在数据读取上,而不针对distinct的计算。

十一,不同sample比例准确性的测试

a08
针对表meta.m_fuxi_instance表中的列project_name,odps_inst_id做了些测试,结果如上。看起来1/50的结果还是可以接受的。
多说一句,对于distinct来说,并不需要完全的正确,10倍以内的差距目前来说是可以接受的,这也是我们可以通过采样来提高效率的前提。

十二,按sample比例为1/25为例的计算结果

a09

执行时间和准确率基本都可以满足现在需求

十三,后续的工作

对于准确率的提升是后续需要做的事情之一,这关键还是如何在sample里面找带更有代表性的点来预测全部数据的形态。但,要作好心理准备,对于某些场景来说,可能就找不到这样的方法,需要接受一定范围的误差。

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
6月前
|
机器学习/深度学习 算法 Oracle
ICLR 2024:近似最优的最大损失函数量子优化算法
【2月更文挑战第27天】ICLR 2024:近似最优的最大损失函数量子优化算法
152 3
ICLR 2024:近似最优的最大损失函数量子优化算法
|
6月前
|
缓存 算法 NoSQL
Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?
Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?
57 0
|
6月前
|
机器学习/深度学习 开发框架 .NET
【Python强化学习】马尔可夫决策过程与蒙特卡洛近似算法讲解(图文解释)
【Python强化学习】马尔可夫决策过程与蒙特卡洛近似算法讲解(图文解释)
83 0
|
分布式计算 算法 大数据
白话Elasticsearch45-深入聚合数据分析之易并行聚合算法,三角选择原则,近似聚合算法
白话Elasticsearch45-深入聚合数据分析之易并行聚合算法,三角选择原则,近似聚合算法
99 0
|
存储 JSON 分布式计算
「PostgreSQL高级特性」PostgreSQL 数据库的近似算法
「PostgreSQL高级特性」PostgreSQL 数据库的近似算法
|
算法 Python
MCMC、蒙特卡洛近似和Metropolis算法简介
MCMC、蒙特卡洛近似和Metropolis算法简介
372 0
MCMC、蒙特卡洛近似和Metropolis算法简介
|
算法 Java C++
算法系统学习-取数先取如何必定获胜?(相对或近似贪心)
该系列是基于有一定语言基础(C,C++,Java等等)和基本的数据结构基础进行的算法学习专栏,如果觉得有点吃力 😥 ,建议先了解前提知识再学习喔!本个专栏会将用更容易理解的表达去学习算法,如果在一些表述上存在问题还请各位多多指点
289 0
|
人工智能 算法 大数据
《中国人工智能学会通讯》——12.7 序列模式挖掘近似算法
本节书摘来自CCAI《中国人工智能学会通讯》一书中的第12章,第12.7节, 更多章节内容可以访问云栖社区“CCAI”公众号查看。
1288 0
|
算法 BI JavaScript
近似算法---首次适宜法
该算法实现非常简单,思路大概是这样子的:      定义若干个空箱子,假设箱子的体积有多大,然后把一些货物存在这些箱子里,当第一个箱子存满后,接着存放第二个箱子,直到货物存完为止,我们来看看这个程序: #include #include #include int FirstFit(in...
903 0