在Hive explain获得执行计划时,经常会看到如下图所示的表数据量统计:

那么这个数据量,Hive是如何统计出来的呢?

一、Data size统计

1.1、Hive源码

在Hive通过Antlr语法解析器获取到SQL的抽象语法树(AST)并生成校验过元数据的逻辑执行计划后,在优化阶段会使用Statistics统计的规则(rule),如下图所示:

AnnotateWithStatistics这个类中,在对执行计划进行转化(transform)时会调用TableScanStatsRule这个规则,如下图所示:

在TableScanStatsRule匹配规则中,在拿到裁剪后涉及的分区范围(PrunedPartitionList)后,会调用collectStatistics()方法开始正式统计表Statistics信息,如下图所示:

获取到select语句等涉及的列信息后,调用同名的重载方法,如下图所示:

在最终重载的collectStatistics()方法中,会调用getDataSize()方法来统计数据量(当然也有统计行数的函数调用),如下图所示:

可以看到统计数据量的逻辑是先从Hive metastore(存在MySQL中)的parameters信息中拿到raw data size,如果没拿到就还是从metastore中拿total data size信息,再没拿到就直接去统计HDFS目录文件的大小,并且乘以反序列化因子(因为表文件可能被压缩编码和序列化过,实际容量大小比原来小)。

1.2、Hadoop源码

那么Hive是如何去HDFS统计表目录下的文件大小的呢?在getDataSize()函数中,会调用Hadoop HDFS上的方法,如下图所示:

去Hadoop源码看看,可以看到如果是文件就会直接计算文件长度,如果是目录就递归统计,如下图所示:

那么这个length是如何计算出来的?getLen()函数会用到一个length变量,这个变量最终是在这里被设置的:

这样最后就到JDK层面了,会返回字节大小,如下图所示:

二、Num rows统计

上面Hive的collectStatistics()函数中,调用了getNumRows()统计表的行数,可以看到如果没能从Hive metastore中拿到行数信息,那么就采用估算的方式,如下图所示:

estimateRowSizeFromSchema()函数中,Hive在拿到表的每一列的信息后,会判断该列的字段类型,从而累加该类型的一个字段值所代表的不同容量大小,分为string、varchar、struct、map等可变长类型和int、double、boolean等固定长度类型两种情况,如下图所示:

累加好表的所有列的一个字段值的容量大小,即估算的一行容量大小后,回到一开始的getNumRows()函数,会把统计的表容量大小除以估算的一行数据的容量大小,最终得到估算的行数,如下图所示:

如果这样都没拿到行数统计(比如之前没拿到表容量等),就返回行数是一行。可以看到Hive的统计方法是有较严谨的响应速度(优先从metastore拿)和容错(万一统计不出来)考虑的。

Hive表数据量统计原理和源码分析相关推荐

  1. [源码分享] HIVE表数据量统计邮件

    概要: 计算HIVE BI库下每天数据表总大小及增量 输出: 总大小:xxxG 日同比新增数据量:xxxG 周同比新增数据量:xxxG 月同比新增数据量:xxxG总表数:xxx 日新增表数:xxx 周 ...

  2. 蚂蚁金服分布式链路跟踪组件 SOFATracer 数据上报机制和源码分析 | 剖析

    2019新春支付宝红包技术大揭秘在线峰会将于03-07日开始,点击这里报名届时即可参与大牛互动. SOFA Scalable Open Financial Architecture 是蚂蚁金服自主研发 ...

  3. altium09怎么查元器件_长文图解:单张表数据量太大问题怎么解决?请记住这六个字...

    JAVA前线  欢迎大家关注公众号「JAVA前线」查看更多精彩分享,主要包括源码分析.实际应用.架构思维.职场分享.产品思考等等,同时也非常欢迎大家加我微信「java_front」一起交流学习 1 文 ...

  4. 面试官问单表数据量大一定要分库分表吗?我们用六个字和十张图回答

    1 文章概述 在业务发展初期单表完全可以满足业务需求,在阿里巴巴开发手册也建议:单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表,如果预计三年后数据量根本达不到这个级别,请不要在创建表时 ...

  5. 并发编程五:java并发线程池底层原理详解和源码分析

    文章目录 java并发线程池底层原理详解和源码分析 线程和线程池性能对比 Executors创建的三种线程池分析 自定义线程池分析 线程池源码分析 继承关系 ThreadPoolExecutor源码分 ...

  6. android lottie字体json,从json文件到炫酷动画-Lottie实现思路和源码分析

    从json文件到炫酷动画-Lottie实现思路和源码分析,Lottie是最近Airbnb开源的动画项目,支持Android.iOS.ReactNaitve三个平台,本文分析主要Lottie把json文 ...

  7. 购物车及商品php代码_php实现商城购物车的思路和源码分析

    本文介绍一个php实现的购物车代码,功能实现完整,具有一定的参考价值 这里我们为你提供个简单的php购物车代码,从增加购物产品与发生购买了,在商城开发中,这个功能是少不了的 具体分析如下: 对购物车里 ...

  8. java.lang.ThreadLocal实现原理和源码分析

    java.lang.ThreadLocal实现原理和源码分析 1.ThreadLocal的原理:为每一个线程维护变量的副本.某个线程修改的只是自己的副本. 2.ThreadLocal是如何做到把变量变 ...

  9. 【原创】【专栏】《Linux设备驱动程序》--- LDD3源码目录结构和源码分析经典链接

    http://blog.csdn.net/geng823/article/details/37567557 [原创][专栏]<Linux设备驱动程序>--- LDD3源码目录结构和源码分析 ...

最新文章

  1. (OCR论文)Mask TextSpotter V3机翻
  2. 在Linux安装配置Tomcat 并部署web应用 ( 三种方式 )
  3. Flutter开发-iOS报错Trying to embed a platform view but the PrerollContext does not s
  4. vue2.0 唤起百度地图app_如何标注百度地图?
  5. Python从入门到精通:Python装饰器详解
  6. Flag counter被博客园禁了的解决方法
  7. asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User
  8. java list 截取_Java常用代码汇总,建议背会
  9. 假如有一门叫做 Ctrump 的编程语言...
  10. Java web后台插入数据库中文乱码问题解决
  11. Android程序员必备精品资源
  12. python:关于三级菜单的新手实现
  13. 利用微搭低代码实现公差申请
  14. IDEA在当前工作空间导入项目
  15. android 高通手机精品游戏合集
  16. 遗传算法调参 参数设置
  17. DS18B20 单总线多器件的ROM 搜索, ALARM 检测, CRC 校验 源码实现, 基于 STM32F103
  18. 常见的加密算法及详解都在这里!
  19. python为什么有gil锁_为什么目前python3的全局锁gil性能远逊于python2
  20. 降调软件测试自学,普通话测试及变调.ppt

热门文章

  1. 使用3DEXPERIENCE云平台建模《冰雪奇缘》雪宝
  2. Himall商城PaymentPara支付参数
  3. 有奖创作 | 社区梦幻联动,文艺人的周年庆
  4. UI设计师这4步从低薪转高薪
  5. 今天母亲节,我做了三件事
  6. 解析:求最大公约数的“辗转相除法原理”
  7. C++界面库大全2013
  8. echarts地图城市散点图
  9. 个人永久性免费-Excel催化剂功能第20波-Excel与Sqlserver零门槛交互-数据上传篇
  10. Python机器学习基础教程10