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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 在项目中遇到按行求中位数的Hive需求,本文通过创建测试数据,展示解决方案。首先使用`lateral view`和`explode`将多字段行转为列,然后通过`percentile`函数计算每行数据的中位数,最终得到结果。该方法适用于将行转为列处理复杂需求,欢迎探讨更优解。

在一般的需求中,我们是根据某一列来求中位数,这种情况可以看我的这篇博客 —— 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 的中位数。

image.png

需求实现:

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

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

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

image.png

然后分组计算每个 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;

最终结果如下:

image.png

需求总结:

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

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

相关文章
|
7天前
|
SQL 分布式计算 大数据
MaxCompute产品使用合集之启用hive兼容的时候,某个字段是null,是否会把这个字段当成空白连起来
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
22天前
|
SQL 分布式计算 关系型数据库
使用 Spark 抽取 MySQL 数据到 Hive 时某列字段值出现异常(字段错位)
在 MySQL 的 `order_info` 表中,包含 `order_id` 等5个字段,主要存储订单信息。执行按 `create_time` 降序的查询,显示了部分结果。在 Hive 中复制此表结构时,所有字段除 `order_id` 外设为 `string` 类型,并添加了 `etl_date` 分区字段。然而,由于使用逗号作为字段分隔符,当 `address` 字段含逗号时,数据写入 Hive 出现错位,导致 `create_time` 值变为中文字符串。问题解决方法包括更换字段分隔符或使用 Hive 默认分隔符 `\u0001`。此案例提醒在建表时需谨慎选择字段分隔符。
|
SQL 文件存储 数据库
Hive分区表的新增字段数据为null的问题解决方法
Hive分区表的新增字段数据为null的问题解决方法
260 0
|
SQL HIVE
Hdfs 导入Hive,时间相关的字段 导入后为NULL
Hdfs 导入Hive,时间相关的字段 导入后为NULL
75 0
|
SQL 分布式计算 运维
【大数据开发运维解决方案】sqoop增量导入oracle/mysql数据到hive时时间字段为null处理
前面几篇文章详细介绍了sqoop全量增量导入数据到hive,大家可以看到我导入的数据如果有时间字段的话我都是在hive指定成了string类型,虽然这样可以处理掉时间字段在hive为空的问题,但是在kylin创建增量cube时需要指定一个时间字段来做增量,所以上面那种方式不行,这里的处理方式为把string改成timestamp类型,看实验:
【大数据开发运维解决方案】sqoop增量导入oracle/mysql数据到hive时时间字段为null处理
|
SQL HIVE
hive创建表并指定字段分隔符
hive创建表并指定字段分隔符
|
SQL 分布式计算 关系型数据库
使用Spark 编码 写入 hive 的过程中 hive字段乱码 [解决方案]
由于元数据中的表结构中包含中文,我在抽取到spark过程中已经解决了一次乱码问题,具体显示为问题????,解决方法是在mysql连接上加参数 spark 字段乱码
374 0
|
SQL HIVE
Hive 删除一个字段
Hive 删除一个字段