在前一篇文章的最后提到,对于准确率的提升是后续需要做的事情之一。接下来看看对于提升准确率,还有哪些事情可以做。

一,回顾

首先回顾下前一篇文章最后得到的结果,如下:

执行时间先忽略,只看准确率。对于上面8个字段,有些在sample为25(采样比例1/25)的情况下还是相当准确的,比如odps_task_type,start_time;而有些则存在一定差距,比如project_name,fuxi_ceil_mem等;还有些存在比较大的差距,比如odps_inst_id,fuxi_avg_cpu。同样的采样算法,同样的估计算法,对于不同的数据会得到截然不同的结果。这种差异相信决大部分来自于数据本身。
下面就从数据本身来看下到底差异是如何出现的。

二,数据差异

不同的字段存储的数据不同,不同数据可能会存在唯一值上的差异。比如说对于主键,比如说对于纬度直,两者肯定在DistinctValue的分布上肯定是完全不同的。

1,如果该字段为主键,那么RowCount(X轴)和DistinctValue(Y轴)关系类似下图:


这是一条斜率为1的直线。
对于这种情况,目前的算法肯定可以非常准确的估算出DistinctValue值。

2,如果该字段为纬度值(唯一值非常少),那么RowCount(X轴)和DistinctValue(Y轴)关系类似下图:


随着RowCount的增加,DistinctValue也在增加,但到了某个点后DistinctValue基本保持不变。

3,如果该字段为一般字段,随着RowCount的增加而DistinctValue也缓慢增加,类似下图:

三,数据差异导致的DistinctValue的计算误差?

上面一部分列举了三种可能的RowCount和DistinctValue关系。第一种类型是比较简单的,也能很准确的估算出DistinctValue值。而对于第二种和第三种则要困难的多,从测试的结果来看是这样的。
我们采样的前提是,采样算法能保证采样是随机的,每条数据被访问的几率是相同的。但实际上这样的前提是不存在的。这也是目前对第三种的估算也可能存在较大差异的原因。因为按道理来说,其实第三种我们也应该能很好的预估才对。目前的采样算法并不是随机的,数据本身分布对采样的结果影响极大。为了性能和实现起来简单,目前采样的算法是隔n条取1条的方式实现的,并不是真正意义上的随机采样。
针对同一次估算过程,我尝试过不同的拟合回归算法,结果并没有特别的不同,问题并不是在算法上,而是在数据本身上。下面通过对存在较大误差的fuxi_avg_cpu来看下,不同的采样比例下的RowCount和DistinctValue关系的差异。




上面几张图对下对比,能看得出来在不同的采样比例下图形的状态会有很大的变化。差异这么大的话想要比较准确的预估显然是不太现实的。

四,总结

目前看来DistinctValue估算的差异大部分原因是因为采样,想要提高准确率增加采样比例就可以了。而具体回归的算法,则没那么重要了。

ComputeColStats UDF中 近似算法的介绍(续)相关推荐

  1. [转]C#中的委托和事件(续)

    源码下载:http://www.tracefact.net/SourceCode/MoreDelegate.rar C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托 ...

  2. java中ThreadPool的介绍和使用

    文章目录 Thread Pool简介 Executors, Executor 和 ExecutorService ThreadPoolExecutor ScheduledThreadPoolExecu ...

  3. Fluent UDF中调用Matlab矩阵运算函数(以二维插值为例)

    Fluent UDF中经常需要用到一些常见算法,例如插值.拟合.矩阵运算等等,这些在UDF中是没有现成函数实现的,理论上需要我们自己去写函数.另一方面我们又注意到这些运算恰恰是Matlab的强项,几乎 ...

  4. HTML中Css详细介绍

    HTML中Css详细介绍 一.样式表的作用 1.Css样式表,层叠样式表 2.类似于人类的衣服,网页的衣服 3.作用:美化网页 4.优势: 1.内容与表现分离,便于维护 2.样式丰富,页面布局灵活 3 ...

  5. Linux下使用ls查看文件颜色全部为白色的解决方法,以及Linux中文件颜色介绍

    1 解决ls查看文件爱呢颜色为白色 方法一: 1.修改~/.bashrc文件,添加如下内容 alias ls='ls --color=auto' 2.source一下,让修改配置生效 source ~ ...

  6. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别

    TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...

  7. c语言字符串加减_C语言中指针的介绍

    C语言中指针的介绍 指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构:能很方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编 ...

  8. Linux中 /boot 目录介绍 【转载】

    Linux中 /boot 目录介绍 转自:点击打开链接 一./boot/目录中的文件和目录 Linux系统在本地启动时,目录/boot/非常重要,其中的文件和目录有: (1)系统Kernel的配置文件 ...

  9. 6.支持向量机(SVM)、什么是SVM、支持向量机基本原理与思想、基本原理、课程中关于SVM介绍

    6.支持向量机(SVM) 6.1.什么是SVM 6.2.支持向量机基本原理与思想 6.2.1.支持向量机 6.2.2.基本原理 6.3.课程中关于SVM介绍 6.支持向量机(SVM) 6.1.什么是S ...

最新文章

  1. c# 5.0入门经典笔记
  2. echarts formatter_vue使用echarts的方法
  3. python基础——Linux系统下的文件目录结构
  4. windows的\r\n与Linux的\n
  5. NopCommerce 2.5的部署
  6. 喝咖啡的好处和坏处及注意事项
  7. join有哪几种方式?内外连接有什么区别?
  8. Android开发通知栏的那些事
  9. 连接数据库出现错误代码为18456
  10. 实验:树莓派通过网线连接笔记本实现网络共享
  11. excel2003打开后找不到工作表
  12. 宝塔 云服务器 外网无法访问 解决办法
  13. 标准ACL,扩展ACL
  14. [附源码]JAVA+ssm计算机毕业设计高校体育馆管理信息系统(程序+Lw)
  15. XGBoost:参数解释
  16. php连接mysql错误:Call to undefined function mysql_connect()
  17. 桌面破坏王游戏开发学习笔记总结
  18. html量子效果,HTML5 量子谐振子动画模拟
  19. 让 AirDrop 支持有线传输,甚至让不支持 AirDrop 的 Mac 也能使用该功能 黑苹果也可以的哦
  20. 利用ubuntu对SD卡分区,生成EXT3、EXT4分区

热门文章

  1. 编写高质量的VB代码
  2. Redis实现计数器---接口防刷
  3. 太像人手了!OpenAI用打DOTA的算法,教会了机械手“盘核桃”
  4. 汤晓鸥为CNN搓了一颗大力丸
  5. 特斯拉Model X撞高速中央隔离带起火,司机受伤身亡
  6. 关于AI与高性能计算加速融合,这里有英伟达最新的4个应用案例
  7. 云服务器的IT价值与部署分析
  8. JavaSE: SuppressWarnings[转]
  9. 3年了,才这点工资,打死我都不相信
  10. WebRequest msdn整理