基于Hive的数据应用实践总结

news/2024/7/7 21:04:29

百分位数(percentile)计算

百分位数含义:统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值按数值大小排列。如,处于p%位置的值称第p百分位数。能够表达p%的数据都是小于这个百分位数。

实现百分位数当前有很多种算法,下面使用一种比较容易理解的方法进行例子说明。

例子:
有下面几个学生分数数据。
Arr = [20,30,50,50,60,10]

将数据按从小到大排序后
Arr = [10,20,30,50,50,60]

percentile(50%) =下标为 3的值,即50。 【(Arr.size()-1)*0.5 = 2.5 四舍五入为 3】,
percentile(100%) = 下标为 5的值,即60。 【(Arr.size()-1)*1 = 5】,显然这个时候是等于Arr的最大值。
percentile(0%) = 下标为 0的值,即10。 【(Arr.size()-1)*0 = 0】,显然这个时候是等于Arr的最小值。

简单的python 代码实现的逻辑如下。

import numpy as np  
  
def percentile(data, p):  
    sorted_data = np.sort(data)  
    k = round((len(data)-1) * p)  
    return sorted_data[k]

SQL实现如下:

--percentile(50%) 
SELECT percentile(num, 0.5) as P50 FROM arr;

数据去重

已有表数据:
在这里插入图片描述
让ID不重复。

select id,gmt_create
from(
select id,gmt_create,row_number() over(partition by id order by gmt_create desc) tag
from table) t1
where tag=1;

以上SQL中row_number()为开窗函数,根据ID来分区,分区内部按时间来排序,然后再给分区里面的数据进行打标。
在这里插入图片描述

滚动指标计算

已有表数据:
在这里插入图片描述
以上是每天的天气温度数据,如果需要输出一个趋势图,横坐表示日期,纵坐标表示当前日期的前7天温度的平均数,则怎么实现呢。

select  gmt_create,SUM(num) num   OVER(PARTITION BY gmt_create ORDER BY gmt_create ROWS BETWEEN 7 PRECEDING AND -1 FOLLOWING) 
num from table;

累计指标计算

已有表数据。
在这里插入图片描述
当天的日期的数据为之前所有日期累计的总和,如1月2日为1+3=4,1月3日为1+3+2=6,以此类推。

select gmt_create,SUM(num) num OVER(PARTITION BY gmt_create ORDER BY gmt_create) AS num from table;

等同于

select  gmt_create,SUM(num) num   OVER(PARTITION BY gmt_create ORDER BY gmt_create ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) num from table;

在这里插入图片描述

多维度聚合分析

有这种的场景,现需分析用户画像,需要统计3个不同维度的聚合,如地理IP、设备,性别。
需要分析不同地理IP、设备、性别分别多少人。
需要分析不同地理IP、设备分别多少人。
需要分析不同地理IP分别多少人。
需要总共有多少人。

传统的分析方法如下实现:

SELECT ip_city, device, sex, COUNT(*)
FROM users GROUP BY ip_city, device, sex
UNION ALL
SELECT ip_city, device, 'ALL'  as sex, COUNT(*)
FROM users GROUP BY ip_city, device
UNION ALL
SELECT ip_city,  'ALL'  as device, 'ALL'  as sex, COUNT(*)
FROM users GROUP BY ip_city
UNION ALL
SELECT 'ALL' as ip_city,  'ALL'  as device, 'ALL'  as sex, COUNT(*)
FROM users 

是不是代码很冗余?

如果使用Hive的多维度聚合分析函数grouping sets,则如下实现。

SELECT ip_city, device, sex ,COUNT(*)
FROM users 
GROUP BY ip_city, device, sex GROUPING SETS((ip_city, device, sex), (ip_city, device), (ip_city),());

上面还是很要写很多字段信息,有没有更简单的?有的。

SELECT ip_city, device, sex ,COUNT(*)
FROM users 
GROUP BY CUBE( ip_city, device, sex);

GROUP BY CUBE( ip_city, device, sex) 等价于
GROUPING SETS((ip_city,device,sex),(ip_city,device),(ip_city,sex),(device,sex),(ip_city),(device),(sex),())

一看起来比之前的需求多算了一些逻辑,因此计算量会更大,所以如果要做优化还是建议采用GROUPING SETS进行剪枝优化。

待续更新。


http://lihuaxi.xjx100.cn/news/1202205.html

相关文章

milkV-duo的Linux的开发环境搭建

目录 写在前面 内核编译 烧录失败的示例(这种情况下就和插上空卡一样) 进入系统 串口进入 SSH接入 写在前面 基本上大部分的问题都能在开源社区上得到答案,记录下我遇到的问题. 附上开源社区 MilkV Community 这里的引脚图和板子的丝印有点对不上&#xff…

Java使用Spark入门级非常详细的总结

目录 Java使用Spark入门环境准备安装JDK安装Spark 编写Spark应用程序创建SparkContext读取文本文件计算单词出现次数 运行Spark应用程序总结 Java使用Spark入门 本文将介绍如何使用Java编写Spark应用程序。Spark是一个快速的、通用的集群计算系统,它可以处理大规模…

卓望数码前端一面

卓望数码前端一面 原文网址:https://www.nowcoder.com/discuss/409361218459234304?sourceSSRsearch 1.css中flex布局有哪些常见的属性 display:flex 首先让一个容器为flex布局应该写 display:flex flex-direction flex有两个关键的轴,分别是主轴…

ServletRequest所有方法详解

ServletRequest 是 Java Servlet 规范中定义的请求对象接口&#xff0c;用于表示客户端的请求信息。下面详细介绍 ServletRequest 接口中的方法&#xff1a; String getParameter(String name) 获取请求参数&#xff0c;返回值类型为 String。 Map<String, String[]> ge…

线程的四个属性

如上图所示&#xff0c;线程有四个属性&#xff1a; 线程ID线程名称守护线程线程优先级 1. 线程ID 每个线程都有id&#xff0c;这个id不能修改 线程id会不停的自增&#xff0c;从1开始 main函数就是第一个线程&#xff0c;id1 id 是操作系统用来识别各个线程的编号&#…

华为OD机试真题 Java 实现【支持优先级的队列】【2023 B卷 100分】

一、题目描述 实现一个支持优先级的队列&#xff0c;高优先级先出队列&#xff0c;同优先级时先进先出。 如果两个输入数据和优先级都相同&#xff0c;则后一个数据不入队列被丢弃。 队列存储的数据内容是一个整数。 二、输入描述 一组待存入队列的数据&#xff08;包含内…

国产新秀---XS5018A,芯昇,图像信号处理芯片

国产视频处理芯片&#xff0c;大崛起。 XS5018A 是一款针对 CMOS 图像传感器的高性价比图像信号处理芯片&#xff0c;支持 1M/2M 像素 图像传感器&#xff0c;一组 10-bit DVP 输入接口&#xff0c; ISP 具备优异的 3D 降噪功能&#xff0c;标清模拟输出支持 960…

行为型设计模式04-状态模式

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 状态模式 1、状态模式介绍 状态模式&#xff08;State&#xff09;是一种行为型设计模式&#xff0c;当一个对象的内在状态改变时…