`
猫耳呀
  • 浏览: 165680 次
社区版块
存档分类
最新评论

ComputeColStats UDF中 近似算法的介绍

阅读更多
 
 一,前面的话
 
表和列的统计信息对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
 
简介
 
对于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
伪代码:
五,基本性能测试
 
 
结论:
 
1,Base Stats对性能也是存在影响的,主要是minValue和maxValue的计算,尤其是collen较长的情况下
2,一般说来distinct相对topK会更慢些,除非在collen较长的时候,topK也是基于比较来的
3,随着列个数的增加,收集stats消耗的时间也线性的增加
4,distinct的计算基于hash,而topK的计算基于比较,所以前者对collen并不敏感
 
六,不同hash函数个数执行效率的测试
 
 
结论:
基本上随着hash函数个数的增加线性的增长
 
七,不同hash函数个数准确性的测试
 
 
结论:
hash函数个数增加到32个后,准确率基本能满足需求
 
八,不同hash函数个数的测试总结
 
 
结论:选择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,采样,拟合
 
基本思路如下图:
 
 
希望通过对sample内的数据进行采样,利用这些采样点描绘全部数据的形态,达到基本准确预测全部数据distinct的结果。这是个美好的愿望,在sample的数据相对较少的时候,总有些情况下sample下的形态跟完整数据的形态存在较大的差异,此时的误差会比较大。
 
十,不同sample比例执行效率的测试
 
 
采样比例在1/100后执行时间差距不大,此时最大的消耗在数据读取上,而不针对distinct的计算。
 
十一,不同sample比例准确性的测试
 
 
针对表meta.m_fuxi_instance表中的列project_name,odps_inst_id做了些测试,结果如上。看起来1/50的结果还是可以接受的。
 
多说一句,对于distinct来说,并不需要完全的正确,10倍以内的差距目前来说是可以接受的,这也是我们可以通过采样来提高效率的前提。
 
十二,按sample比例为1/25为例的计算结果
 
执行时间和准确率基本都可以满足现在需求
 
十三,后续的工作
 
对于准确率的提升是后续需要做的事情之一,这关键还是如何在sample里面找带更有代表性的点来预测全部数据的形态。但,要作好心理准备,对于某些场景来说,可能就找不到这样的方法,需要接受一定范围的误差。
 
阅读更多干货好文,请关注扫描以下二维码:
 
分享到:
评论

相关推荐

    Fluent UDF 中文教程.zip_Fluent UDF 中文教程_UDF fluent_fluent udf_udf_ud

    在本文中,我们将深入探讨Fluent UDF的基本概念、应用范围、编写技巧以及一些常见的UDF算法。 一、Fluent UDF基本概念 UDF是用户定义的函数,它扩展了Fluent内置的物理模型,为用户提供了一种定制求解器的能力。...

    Fluent_UDF_中文教程.zip_fluent_fluent udf_fluent udf 教程_fluent udf手册

    Fluent UDF教程首先会介绍UDF的基本概念,包括UDF的作用、结构以及在Fluent中的地位。UDF由头文件、源文件和初始化文件组成,每个部分都有其特定的功能。头文件包含函数声明,源文件实现这些函数,而初始化文件则...

    UDF.rar_udf中x方向动量编写_动量udf

    在这个“UDF.rar_udf中x方向动量编写_动量udf”案例中,我们主要关注的是如何在UDF中编写用于处理x方向动量方程的代码。 UDF的基本结构通常包括初始化、计算和后处理三个部分。在初始化阶段,UDF会设置一些初始条件...

    UDF中文手册FLUENT

    UDF(User Defined Functions)是ANSYS FLUENT软件中的一个重要特性,允许用户自定义流体动力学模拟中的计算函数,以实现特定的物理模型或算法。这份“UDF中文手册FLUENT”是专为ANSYS FLUENT用户设计的,提供了详细...

    fluent UDF中文帮助文档

    简要的介绍用户自定义函数UDF及其在FLUENT中的用法,主要包括什么是UDF、威为什么使用UDF、UDF的局限、UDF基础、解释和编译UDF等

    Fluent_UDF_中文教程.pdf

    用户自定义函数(UDF)是一种允许用户将自编写的程序动态连接到Fluent求解器中的机制,以提高求解器的性能和灵活性。UDF是使用C语言编写的,通过特定的DEFINE宏来定义。它们可以调用标准的C库函数,也可以利用Fluent...

    udf 中文帮助 中文教程

    UDF(User Defined Functions)是ANSYS Fluent软件中的一个强大特性,允许用户自定义计算流体动力学(CFD)模拟中的物理模型和算法。在ANSYS Fluent中,UDF可以用来扩展内置的物理模型,解决特定的工程问题,如复杂...

    UDF中文手册.rar

    UDF(User Defined Functions)是ANSYS FLUENT软件中的一个重要特性,允许用户根据特定需求编写自定义函数,以扩展其内置功能。本手册“UDF中文手册.rar”提供了全面的UDF指南,帮助用户深入理解和应用这一强大的...

    UDF中文手册_FluentUDF中文手册_udf帮助手册_

    ANSYS Fluent 帮助文件的自定义函(UDF)的英文翻译版

    fluent UDF中文详细教程

    尽管UDF功能强大,但它并不能改善Fluent算法本身,这是一个限制,因为算法的优化是提高软件性能的关键因素之一。尽管如此,UDF仍然是一个非常有用的工具,特别适用于那些对标准Fluent功能有额外需求的用户。

    Fluent UDF 中文教程_fluentudf_fluentudf_udffluent_UDF中文教程_

    在“Fluent UDF 中文教程”中,用户不仅可以学习到UDF的基本概念和语法,还能逐步掌握如何结合宏和解算器变量进行高级的流体模拟。这将极大地扩展Fluent的适用范围,帮助用户解决那些标准模型无法处理的复杂问题。...

    UDF中文帮助文档

    为了更好地理解UDF的实际应用,接下来将逐步介绍一个具体的UDF示例,包括从编写代码到在Fluent中使用的全过程。这一部分的具体内容将在后续章节中详细介绍。 通过以上内容,我们可以看出UDF作为一种强大的自定义...

    Fluent UDF中文手册_ds2780中文手册

    共计10章内容: 1、概述 2、UDF的C语言基础 3、编写UDF 4、DEFINE宏 5、使用宏访问各类变量 6、针对FLUENT变量性能计算的FLUENT公司...8、在FLUENT中激活你的UDF 9、FLUENT 中用户自定义标量及它们的用法 10、应用举例

    Fluent UDF 中文教程_fluent教程_udf_udf学习教程_

    UDF(User-Defined Functions)是Fluent提供的一种强大的自定义功能,允许用户编写C或C++程序来扩展其内置的物理模型和算法。本教程专为初学者设计,旨在帮助用户快速掌握UDF的编写和应用。 Fluent UDF教程主要涵盖...

    UDF中文帮助.pdf

    用户自定义函数(UDF)是Fluent计算流体动力学(CFD)软件中一个非常重要的概念,它允许用户通过编写C语言程序来扩展Fluent的功能。在Fluent中,UDF主要用于处理那些标准软件无法覆盖的特定问题和需求,如自定义边界...

    Fluent UDF 中文教程_fluent_udf_UDFfluent_

    1. **Fluent User Guide**:官方文档是学习UDF的重要参考资料,它详细介绍了UDF的语法、结构以及如何与Fluent集成。 2. **在线教程**:网上有许多关于Fluent UDF的中文教程,包括视频教程、博客文章和论坛讨论,...

    ANSYS Fluent UDF Manual.rar_ANSYS FLUENT UDF_UDF manual_UDF-flu

    UDF手册详细介绍了如何创建、编译和链接UDF,以及如何在Fluent环境中调用它们。 手册的第一部分通常会介绍UDF的基本概念,包括UDF的结构、函数类型和数据类型。UDF由多个函数组成,如初始化函数、计算函数和后处理...

    fluent UDF手册-工具.zip_fluent_udf_udf 手册_udf手册

    在“第6章.doc”中,可能详细介绍了UDF在实际问题中的应用,例如如何创建一个自定义的湍流模型或者实现特定的源项。这部分内容可能涵盖了以下知识点: 1. **自定义源项**:UDF可用于添加新的源项,比如化学反应源项...

    Fluent UDF 中文教程

    UDF中可使用标准C语言的库函数,也可使用Fluent Inc.提供的预定义宏,通过这些预定义宏,可以获得Fluent求解器得到的数据。 UDF使用时可以被当作解释函数或编译函数。解释函数在运行时读入并解释。而编译UDF则在编译...

    multiphase_fluentudf_多相流_多相流udf_udf_多相流udf_

    描述中提到的“关于fluent中多相流模拟的udf的例子”,意味着这个压缩包可能包含了一些具体的UDF代码示例,用于指导用户如何在Fluent中编写和应用UDF进行多相流的模拟。这些示例可能涵盖了初始化多相流模型、定义交...

Global site tag (gtag.js) - Google Analytics