hive分位函数percentile和percentile_approx误区和解决方案

这篇具有很好参考价值的文章主要介绍了hive分位函数percentile和percentile_approx误区和解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

hive分位函数percentile和percentile_approx误区和解决方案

先说结论

percentile和percentile_approx对分位数的计算是不同的!!!

拿中位数来说,
percentile(col, 0.5),结果和正常理解的中位数相同,即col排序后最中间的一个数(col观察数为奇数时)或者最中间两个数的平均数(col观察数为偶数时)为中位数;
percentile_approx(col, 0.5),则是按照等频划分的方法来计算中位数的。

分位函数用法

介绍分位函数的用法

  1. 整数类型 percentile

percentile(col, p):col是要计算的列(值必须为整数类型);参数p取值为0-1。

当需要多个分位数的时候,可以用array数组,格式为:percentile(col, array(p1, p2, …,pn))

  1. 浮点或整数类型 percentile_approx

percentile_approx(col, p, B):col是要计算的列(值可以是浮点类型);参数p取值为0-1;参数B控制内存消耗的近似精度,B越大,结果的精度越高,默认值为10000,当col字段中的distinct值的个数小于B时,结果就为准确的百分位数,可不填。

当需要多个分位数的时候,可以用array数组,格式为:percentile_approx(col, array(p1, p2, …,pn), B)

分位函数用法示例

建表语句:col_int 为整数,col_double 为浮点数

CREATE TABLE  test.test_table
(
	`col_int` int
	,`col_double` double
) 

插入数据:9条(奇数条)

insert into test.test_table values 
	(1, 0.15)
	,(2, 0.25)
	,(3, 0.35)
	,(4, 0.45)
	,(5, 0.55)
	,(6, 0.65)
	,(7, 0.75)
	,(8, 0.85)
	,(9, 0.95)

查询结果:中位数,即50分位数

-- 查询1
select percentile(t.col_int, 0.5) from test.test_table t ; -- 5
-- 查询2
select percentile_approx(t.col_int, 0.5) from test.test_table t ; -- 4.5
-- 查询3
select percentile_approx(t.col_double, 0.5) from test.test_table t ; -- 0.5

疑问

为什么整数列 col_int 使用 percentile 和 percentile_approx 的结果不一样?

为什么浮点数列 col_double 使用 percentile_approx 的结果是0.5而不是0.55?

解析

对于整数列的中位数:
percentile 在奇数个数值时,排序后,第(n+1)/2位数 即为中位数,所以查询1的结果是5;
percentile 在偶数个数值时,排序后,第n/2位数第n/2+1位数 的平均值即为中位数;
percentile_approx 通过等频率划分来计算中位数,在奇数个数值时,排序后,第1个数的为累积概率1/9,依次第4个数的累积概率为4/9,第5个数的累积概率为5/9,等频率中位数的计算为 (4 x (1/2 - 4/9) + 5 x (5/9 - 1/2) / (5/9 - 4/9) = 4.5 ,化简可以得到 (4+5)/2,即 第(n+1)/2位数第(n-1)/2位数 的平均值为等频中位数;
percentile_approx 在偶数个数值时,排序后,第n/2位数 的累积概率为0.5,故 第n/2位数 即为等频中位数。

对于浮点数列的中位数:
percentile_approx 计算等频中位数的方法同上。

验证

往表里新增一条数据,把数据集变成偶数列,验证上述解析:

insert into test.test_table values 
	(10, 1.05)

查询结果:符合预期

-- 查询4
select percentile(t.col_int, 0.5) from test.test_table t ; -- 5.5
-- 查询5
select percentile_approx(t.col_int, 0.5) from test.test_table t ; -- 5
-- 查询6
select percentile_approx(t.col_double, 0.5) from test.test_table t ; -- 0.55

提问:如果想对浮点数取中位数而不是等频中位数怎么办?

可以对浮点数列乘以相应的倍数,转化为整数列,使用percentile获得想要的中位数。例如:文章来源地址https://www.toymoban.com/news/detail-752847.html

-- 查询7
select percentile(int(t.col_double * 100), 0.5) / 100 from test.test_table t ; -- 0.6

到了这里,关于hive分位函数percentile和percentile_approx误区和解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用JavaScript将数字格式化成千分位的n种方法

    1,使用数组方法: 1) 数字转字符串,字符串按照小数点.分割 2) 整数部分拆分成字符串数组,并倒叙 3) 遍历, 按照每三位添加逗号,号 4) 拼接整数部分+小数部分 2.使用字符串的substring截取 1) 数字转字符串,并按照小数点’.’分割 2) 整数部分对3取模,获取余数, 获得substring(0, 余数)的

    2024年02月04日
    浏览(38)
  • sql进阶:求满足某列数值相加无限接近90%的行(90分位)

    表中有某个id列和数值列,求数值列占比为90%的id,如有个用户表,存储id和消费金额order_cnt,求一条sql查出消费占比无限接近90%的所有客户,如表中总消费为10000,占比最高的是4000、3000、2800,对应A、B、C用户,查出A、B、C用户

    2024年02月15日
    浏览(29)
  • Hive常见报错与解决方案

    公司近期上火山云,hive、hadoop、tez等都有较大的版本升级,继而引发了 一系列的报错。现将遇到的报错内容以及相应解决方法列出来,供大家参考。 关于版本: 组件 升级前 升级后 Hive 1.2 2.3 Hadoop 2.6 2.10 Tez 0.7 0.10 1.hive中无法执行HDFS命令,查看目录属性等 原因: 开源的2.

    2024年01月15日
    浏览(31)
  • Hive数据倾斜的原因以及常用解决方案

    在Hadoop平台的hive数据库进行开发的时候,数据倾斜也是比较容易遇到的问题,这边文章对数据倾斜的定义以及产生的原因、对应的解决方案进行学习。 数据倾斜:数据分布不均匀,造成数据大量的集中到一点,造成数据热点。主要表现为任务进度长时间维持在 99%或者 100%的

    2024年02月15日
    浏览(39)
  • Hive数据倾斜常见场景及解决方案(超全!!!)

    Hive数据倾斜常见问题和解决方案 目录 前言 一、Explain 二、数据倾斜 1.什么是数据倾斜?它的主要表现? 2.产生数据倾斜的常见原因 一.join时:首先是大表关联小表,容易发生数据倾斜 二.join时:空key过多,或者相同key过多 三.join时:不同数据类型关联产生数据倾斜 四.join时

    2024年02月03日
    浏览(33)
  • 基于MapReduce的Hive数据倾斜场景以及解决方案

    通常认为当所有的map task全部完成,并且99%的reduce task完成,只剩下一个或者少数几个reduce task一直在执行,这种情况下一般都是发生了数据倾斜。 即为在整个计算过程中,大量相同的key被分配到了同一个reduce任务上造成。Hive的数据倾斜本质上是MapReduce计算引擎的数据倾斜,

    2024年02月13日
    浏览(31)
  • 第十六章 Hive生产环境优化&数据倾斜解决方案

    Hive调优作用:在保证业务结果不变的前提下,降低资源的使用量,减少任务的执行时间。 1、调优须知 (1)对于大数据计算引擎来说:数据量大不是问题, 数据倾斜是个问题。 (2)Hive的复 杂HQL底层会转换成多个MapReduce Job并行或者串行执行 ,Job数比较多的作业运行效 率相

    2024年02月12日
    浏览(26)
  • Hive表锁机制原理以及各种场景的解决方案

    hive 锁机制(S锁,X锁) 是由hive的事务管理器出发,锁的原理是 一张表简称A表,我们对A表做查询操作的时候,就会获取到 A表的S锁(共享锁), 如果对A表做alter 等其他操作就会获取A表的X锁(排他锁) 如果A表同时拥有S锁和X锁,A表就会死锁。死锁后的现象就是做drop truncate 等操作会

    2024年02月02日
    浏览(26)
  • 关于hive3多表leftjoin导致数据丢失问题及解决方案

    最近业务场景需要将一张大表通过name名字关联多个小表去获取他们的id,大表数据9000w,小表数据最大180w,最小30w,我以主表leftjoin的时候发现了数据丢失问题 代码如下  结果显示数据我t7的数据由180w剩下9w,发生了严重的数据丢失,在别的表也有不同程度的丢失问题. 最后发现这个问

    2024年02月15日
    浏览(43)
  • 【大数据之Hive】十六、Hive-HQL函数之窗口函数(开窗函数)

      先定义了窗口的大小(按行来算),然后对窗口内的行的数据进行计算,再将计算结果返回给改行。   窗口函数包括窗口和函数两部分,窗口用于定义计算范围,函数用于定义计算逻辑,窗口函数只会在原来的表上增加一列结果列,不改变原来的数据。 函数:   绝

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包