Hive 求多个字段的中位数(按行求中位数)

在一般的需求中,我们是根据某一列来求中位数,这种情况可以看我的这篇博客 —— Hive 之中位数

今天在公司项目中遇到了需要按行求中位数的情况,于是通过这篇博客记录一下我的解决方法。

测试数据建立:

create database if not exists test;

drop table if exists test.company;

create table test.company(
id int,
data1 int,
data2 int,
data3 int);

insert into test.company values(1,10,20,30),(2,40,50,60),(3,70,80,90),(4,100,110,120),(5,130,140,150);

需求介绍:

在 Hive 中我建立了 test.company 测试表,需要求出每一行 data1,data2,data3 的中位数。

在这里插入图片描述

需求实现:

我们先将多个字段数据的行转换为列。

select
   id,
   tmp.data
from
   test.company
   lateral view
         explode(array(data1,data2,data3)) tmp as data;

执行后得到如下样式的数据:

在这里插入图片描述

然后分组计算每个 id 的中位数。

select
   id,
   cast(percentile(data,0.5) as int) median_data
from
   (select
      id,
      tmp.data
   from
      test.company
      lateral view
            explode(array(data1,data2,data3)) tmp as data)t1
group by
         id;

最终结果如下:

在这里插入图片描述

需求总结:

首先我们将多个字段通过 array 构成一个数组,然后通过 explode 方法将该数组打散,转换成列,最后分组计算中位数,解决需求。

这个问题最终还是得将行转为列来做,目前我就想到这种思路,有其他更好的方法可以一起讨论。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮给我抄代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值