上一篇中咱们介绍了使用Excel和Python计算统计值,这次咱们使用Hive来计算统计值。

先来回顾一下数据和对应的统计结果:

这里咱们使用的是iris分类数据集,数据下载地址为:

http://archive.ics.uci.edu/ml/datasets/Iris

下载后转换为xlsx格式的文件,数据如下:

对应的统计结果如下:

接下来先进入实战部分,最后再总结下本地Hive使用过程中的一些坑。

1、使用Hive计算统计值

1.1 最大值、最小值

使用Hive统计最大值直接使用max和min函数就可以:

selectmax(feature1) as max_feature1,max(feature2) as max_feature2,max(feature3) as max_feature3,max(feature4) as max_feature4
from iris;

结果输出如下:

selectmin(feature1) as min_feature1,min(feature2) as min_feature2,min(feature3) as min_feature3,min(feature4) as min_feature4
from iris;

结果输出如下:

咦,这里很奇怪的一点是,怎么不显示列名呢?这里如果想显示列名的话,需要进行设置:

set hive.cli.print.header=true;

此时再执行上面的SQL,就可以啦:

1.2 平均值

平均值的计算使用avg函数:

selectavg(feature1) as avg_feature1,avg(feature2) as avg_feature2,avg(feature3) as avg_feature3,avg(feature4) as avg_feature4
from iris;

输出为:

1.3 样本标准差&总体标准差

Hive中总体标准差的计算有两个函数可以使用,分别是stddev函数和stddev_pop函数:

selectstddev_pop(feature1) as std_feature1,stddev_pop(feature2) as std_feature2,stddev(feature3) as std_feature3,stddev(feature4) as std_feature4
from iris;

输出结果为:

样本标准差使用stddev_samp方法:

selectstddev_samp(feature1) as std_feature1,stddev_samp(feature2) as std_feature2,stddev_samp(feature3) as std_feature3,stddev_samp(feature4) as std_feature4
from iris;

输出结果为:

1.4 中位数

Hive中求中位数和求四分位数使用的是用一个方法,如果你的数据是整数,可以使用percentile方法:

select percentile(feature1,0.5) as median_feature1 from iris;

但由于咱的数据不是整数,所以会报如下的错误:

FAILED: NoMatchingMethodException No matching method for class org.apache.hadoop.hive.ql.udf.UDAFPercentile with (double, decimal(1,1)). Possible choices: _FUNC_(bigint, array<double>)  _FUNC_(bigint, double)

想要处理double类型的数据,可以使用percentile_approx方法:

select percentile_approx(feature1,0.5) as median_feature1 from iris;

输出结果为:

稳了么?不稳啊,这个结果和咱们Excel的结果不一样啊,这个函数是等频划分的方法来计算中位数的,什么是等频划分计算的中位数呢,举个简单的例子:一组数据的分布情况如下:

也就是说,按从小到大排序之后,1的累积概率为10%,小于等于2的累积概率是30%,小于等于3的累积概率是60%,如果按我们之前的理解,中位数就是3,那么按照等频划分的话,中位数是恰好累积概率取得50%的时候的那个数,很显然,这个数应该在2和3之间,且离3比较近。

所以,按照距离规则,此时的中位数是(2 * (0.6 - 0.5) + 3 * (0.5 -0.3) ) / (0.6 - 0.3) = 2.67。

而在我们这个数据集中,5.7的累积概率是0.48667、5.8的累积概率是0.5333,所以按照公式,中位数是 (5. 7 * (0.5333 - 0.5) + 5.8 * (0.5 - 0.48667)) / (0.5333 - 0.48667) = 5.72857,与Hive给出的结果一样。

因此,直接使用Hive函数看来是行不通了,得自己对数据进行处理了。

计算中位数也好,计算四分位数也好,无非就是要取得两个位置嘛,假设我们的数据从小到大排,按照1、2、3、.. 、n进行编号,当数量n为奇数时,取编号(n + 1)/2位置的数即可,当n为偶数时,取(int)(n + 1)/2位置和(int)(n + 1)/2 + 1位置的数取平均即可。但二者其实可以统一到一个公式中:

1)假设n = 149 ,(n+1)/2 = 75 ,小数部分为0,那么中位数=75位置的数 * (1 - 0)+ 76位置的数 * (0 - 0)
2)假设n = 150,(n+1)/2 = 75,小数部分为0.5,那么中位数=75位置的数 * (1 - 0.5)+ 76位置的数 * (0.5 - 0)

所以,我们可以把这个过程分解为三个步骤,第一步是给数字进行一个编号,我们使用row_number()函数(该函数的具体用法后续再展开,这里只提供一个简单的例子),第二步是计算(n+1)/2的整数部分和小数部分,第三步就是根据公式计算中位数。

首先使用row_number()给数据进行编号:

selectfeature1,row_number() over(order by feature1 asc) as rank
from iris;

输出如下:

接下来是确定中位数的位置,这里我们分别拿到(n + 1)/2的整数部分和小数部分:

selectcast((count(feature1) + 1) / 2 as int) as int_part,(count(feature1)+1)   / 2 % 1 as float_part
from iris;

输出如下:

这里小数部分不为0,意味着我们不仅要拿到rank=75的数,还要拿到rank=76的数,我们最好把其放到一行上,这里使用lead函数,lead函数的作用就是拿到分组排序后,下一个位置或下n个位置的数,咱们在后面的博客中还会细讲,这里也只是抛砖引玉:

selectfeature1,row_number() over(order by feature1 asc) as rank,lead(feature1,1) over(order by feature1 asc) as next_feature1
from iris;

输出如下:

接下来,join两个表,按公式计算中位数就可以啦:

selectfeature1 * (1 - float_part) + next_feature1 * (float_part-0) as median
from (selectfeature1,row_number() over(order by feature1 asc) as rank,lead(feature1,1) over(order by feature1 asc) as next_feature1from iris) a
inner join(selectcast((count(feature1) + 1) / 2 as int) as int_part,(count(feature1)+1) / 2 % 1 as float_partfrom iris) bon a.rank = b.int_part;

输出如下:

1.5 四分位数

先来复习下四分位数的两种解法,n+1方法和n-1方法:

对于n+1方法,如果数据量为n,则四分位数的位置为:

Q1的位置= (n+1) × 0.25
Q2的位置= (n+1) × 0.5
Q3的位置= (n+1) × 0.75

对于n-1方法,如果数据量为n,则四分位数的位置为:

Q1的位置=1+(n-1)x 0.25
Q2的位置=1+(n-1)x 0.5
Q3的位置=1+(n-1)x 0.75

这里的思路和求解中位数是一样的,我们分别实现一下两种方法,首先是n+1方法:

selectfeature1 * (1 - float_part) + next_feature1 * (float_part-0) as q1
from (selectfeature1,row_number() over(order by feature1 asc) as rank,lead(feature1,1) over(order by feature1 asc) as next_feature1from iris) a
inner join(selectcast((count(feature1) + 1) * 0.25 as int) as int_part,(count(feature1)+1) * 0.25 % 1 as float_partfrom iris) bon a.rank = b.int_part;

输出为:

接下来是n-1方法:

selectfeature1 * (1 - float_part) + next_feature1 * (float_part-0) as q1
from (selectfeature1,row_number() over(order by feature1 asc) as rank,lead(feature1,1) over(order by feature1 asc) as next_feature1from iris) a
inner join(selectcast((count(feature1) - 1) * 0.25 as int)  + 1 as int_part,(count(feature1) - 1) * 0.25 % 1 as float_partfrom iris) bon a.rank = b.int_part;

输出为:

2、踩坑总结

这里总结两个本地跑Hive时遇到的两个错误:

2.1 The auxService:mapreduce_shuffle does not exist

当报org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService:mapreduce_shuffle does not exist错误时,因为Hive底层执行job是hadoop的MP,如果auxService:mapreduce_shuffle不存在,我们就须要配置。

具体做法是在hadoop的配置文件yarn-site.xml文件中,添加以下内容:

<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value>
</property>
<property><name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name><value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

2.2 java.lang.OutOfMemoryError: PermGen space

当报错Exception in thread "main" java.lang.OutOfMemoryError: PermGen space时,在hive/conf/hive-env.sh文件中,加入下面的内容,问题得以解决:

export HADOOP_OPTS="$HADOOP_OPTS -XX:PermSize=512M -XX:MaxPermSize=1024M"

使用Hive SQL计算数列统计值相关推荐

  1. python对excel数据统计_数据分析EPHS(4)-使用Excel和Python计算数列统计值

    前面环境都搞的差不多了,这次咱们进入实战篇,来计算一列的统计值.统计值主要有最大值.最小值.均值.标准差.中位数.四分位数.话不多说,直接进入正题. 本文介绍使用Excel和Python来计算上述统计 ...

  2. spark常用功能:使用Spark计算数列统计值

    参考 : -- https://cloud.tencent.com/developer/article/1475487 先来回顾一下数据和对应的统计结果: 本文使用的是iris分类数据集,数据下载地址 ...

  3. 如何用python完成基本统计信息计算_如何用python计算基本统计值?

    如何用python计算基本统计值? 用python计算基本统计值的代码为def getNum(): #从控制台获取多个不确定数据的方法 nums = []; iNumStr = input(" ...

  4. r计算百分位数_R语言:用R计算各种统计值

    目录:求极差(range) 做频数分布表和频数分布图(graph of frequency distribution) 算术平均数(mean) 几何均数(geometric mean) 中位数与百分位 ...

  5. Hive SQL 计算指定日期本周的第一天和最后一天

    selectday,dayofweek(day) as dw1,date_add(day,1 - dayofweek(day)) as Su_s -- 周日_start,date_add(day,7 ...

  6. 计算基本统计值,输出一组数据的平均值,方差,众数和中位数

    一,思路. (1)获取数据(数据类型应该是数值型) (2)求平均值---初步想法 ①:for循环遍历求和: ②:sum()函数直接求和 (3)求方差---貌似只想到了遍历求 (4)求众数---首先想到 ...

  7. hive sql 根据出生日期计算年龄(闰年同样准确)

    需求:根据用户出生日期,用hive sql计算用户年龄 由于闰年原因,直接用datediff计算当前与出生日期天数去除以365会造成年龄不准确,所以对数据进行处理来计算准确的年龄 select if( ...

  8. pandas使用groupby函数计算dataframe数据中每个分组的滚动统计值(rolling statistics)的语法:例如分组的N天滚动平均值、滚动中位数、滚动最大最小值、滚动加和等

    pandas使用groupby函数计算dataframe数据中每个分组的滚动统计值(rolling statistics)的语法:例如分组的N天滚动平均值.滚动中位数.滚动最大最小值.滚动加和等 目录

  9. R语言编写自定义描述统计计算函数、使用doBy包的summaryBy函数计算不同分组(group)的描述性统计值(Descriptive statistics by group、样本个数、均值、标准)

    R语言编写自定义描述统计计算函数.使用doBy包的summaryBy函数计算不同分组(group)的描述性统计值(Descriptive statistics by group using summa ...

  10. R语言进行数据聚合统计(Aggregating transforms)计算滑动窗口统计值(Window Statistics):使用R原生方法、data.table、dplyr等方案、计算滑动分组统计

    R语言进行数据聚合统计(Aggregating transforms)计算滑动窗口统计值(Window Statistics):使用R原生方法.data.table.dplyr等方案.计算滑动分组统计 ...

最新文章

  1. IE下的拖拽Drag事件和示例
  2. WSDL SOAP 绑定
  3. mean项目的分模块开发
  4. linux下编译jrtplib-3.9.1
  5. flutter图片聊天泡泡_flutter即时聊天IM仿微信|flutter聊天界面
  6. php多线程扩展pthreads安装使用,swoole多进程,内置多进程
  7. python实现微信自动回复_python实现微信自动回复功能
  8. pioneer软件VoLTE测试步骤,世纪鼎利Pioneer连接移动平台进行VoLTE测试操作说明综述...
  9. npm install 报错 npm ERR! errno ETIMEDOUT
  10. 专访Blue Coat:移动恶意软件现状与趋势
  11. Android Studio Offline work mode
  12. 九个小众实用设计预览网站
  13. canvas+gif.js打造自己的数字雨头像
  14. npm install --save-dev
  15. Blend for Visual Studio 让XAML也可以像WinForm一样可视化设计,Blend 与Studio的区别
  16. 记一次zookeeper连接慢的问题和解决方法
  17. 【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)
  18. java 20008年月历输出 日期的个位与星期数相等 的日子
  19. PPT 如何取消幻灯片自动播放
  20. Qt对word文档操作总结

热门文章

  1. vue-study-1 mvx模式
  2. 实战四:Kaggle自行车租赁预测比赛
  3. 生物电(ECG、EMG、EEG)科普研究
  4. 黑客帝国「缸中之脑」真的可以,这100万个「活体人脑细胞」5分钟学会打游戏...
  5. C#winform软件长时间运行后无响应问题解决
  6. 计算机专业毕业设计流程,计算机专业毕业设计答辩流程
  7. 团队管理,领导的“无为”就是最大“有为”
  8. oracle数据库重启命令是什么
  9. 单元测试--Mockito之spy
  10. 【mmDetection框架解读】入门篇一、各组件解读,配置文件解读