当前位置: 首页 > article >正文

大数据学习(129)-Hive数据分析

🍋🍋大数据学习🍋🍋

🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞


一、窗口函数进阶

1. 累计分布计算
  • 题目
    计算每个用户的消费金额在全量用户中的累计分布百分比(即该用户消费超过了百分之多少的用户)。
    表结构user_transactions(user_id, amount)

  • 参考答案

    SELECT user_id,amount,CUME_DIST() OVER (ORDER BY amount) AS percentile
    FROM user_transactions;
    
  • 扩展练习
    找出消费金额超过 90% 用户的 “超级用户”,并计算其总消费占比。

2. 分组排名跳跃问题
  • 题目
    计算每个部门中薪资排名前三的员工,若有并列则跳过后续排名(如两个第 1 名后,下一名为第 3 名)。
    表结构employees(emp_id, dept_id, salary)

  • 参考答案

    WITH ranked_employees AS (SELECT emp_id,dept_id,salary,DENSE_RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS salary_rankFROM employees
    )
    SELECT *
    FROM ranked_employees
    WHERE salary_rank <= 3;
    
  • 关键区别

    • RANK():允许并列,后续排名跳跃(如 1,1,3)。
    • DENSE_RANK():允许并列,后续排名连续(如 1,1,2)。

二、日期与时间序列

3. 缺失日期填充
  • 题目
    生成用户每日活跃状态表,包括无活动的日期(用 0 填充)。
    表结构user_activity(user_id, activity_date)

  • 参考答案

    WITH date_range AS (SELECT user_id,MIN(activity_date) AS start_date,MAX(activity_date) AS end_dateFROM user_activityGROUP BY user_id
    ),
    all_dates AS (SELECT dr.user_id,ad.dateFROM date_range drLATERAL VIEW explode(sequence(to_date(dr.start_date), to_date(dr.end_date), 1)) ad AS date
    )
    SELECT ad.user_id,ad.date,IF(ua.activity_date IS NULL, 0, 1) AS is_active
    FROM all_dates ad
    LEFT JOIN user_activity ua 
    ON ad.user_id = ua.user_id AND ad.date = ua.activity_date;
    
  • Hive 特性
    使用 sequence() 和 LATERAL VIEW explode() 生成连续日期。

4. 会话识别(Sessionization)
  • 题目
    将用户行为按30 分钟无操作间隔划分为不同会话(session),并计算每个会话的持续时间。
    表结构user_events(user_id, event_time, event_type)

  • 参考答案

    WITH time_diff AS (SELECT user_id,event_time,event_type,UNIX_TIMESTAMP(event_time) - UNIX_TIMESTAMP(LAG(event_time) OVER (PARTITION BY user_id ORDER BY event_time)) AS seconds_since_lastFROM user_events
    ),
    session_markers AS (SELECT user_id,event_time,event_type,IF(seconds_since_last > 1800 OR seconds_since_last IS NULL, 1, 0) AS new_sessionFROM time_diff
    ),
    session_ids AS (SELECT user_id,event_time,event_type,SUM(new_session) OVER (PARTITION BY user_id ORDER BY event_time) AS session_idFROM session_markers
    )
    SELECT user_id,session_id,MIN(event_time) AS session_start,MAX(event_time) AS session_end,UNIX_TIMESTAMP(MAX(event_time)) - UNIX_TIMESTAMP(MIN(event_time)) AS session_duration_seconds
    FROM session_ids
    GROUP BY user_id, session_id;
    
  • 核心逻辑
    通过 LAG() 计算相邻事件的时间差,超过阈值则标记为新会话。

三、多表关联与复杂查询

5. 树形结构路径查询
  • 题目
    查询商品分类树的完整路径(如 “电子产品> 手机 > 智能手机”)。
    表结构categories(category_id, parent_id, category_name)

  • 参考答案

    WITH RECURSIVE category_paths AS (SELECT category_id,parent_id,category_name,CAST(category_name AS STRING) AS pathFROM categoriesWHERE parent_id IS NULL  -- 根节点UNION ALLSELECT c.category_id,c.parent_id,c.category_name,CONCAT(cp.path, ' > ', c.category_name)FROM categories cJOIN category_paths cp ON c.parent_id = cp.category_id
    )
    SELECT *
    FROM category_paths;
    
  • Hive 限制
    Hive 不支持标准的 WITH RECURSIVE,需改用循环查询或 UDF 实现。

6. 交叉销售分析
  • 题目
    找出用户同时购买但不在同一订单中的商品对(如用户 A 先买了手机,后买了手机壳)。
    表结构orders(order_id, user_id, product_id, order_date)

  • 参考答案

    SELECT o1.user_id,o1.product_id AS product_a,o2.product_id AS product_b,COUNT(DISTINCT o1.order_id) AS a_orders,COUNT(DISTINCT o2.order_id) AS b_orders
    FROM orders o1
    JOIN orders o2 
    ON o1.user_id = o2.user_id 
    AND o1.product_id < o2.product_id  -- 避免重复组合
    AND o1.order_id != o2.order_id    -- 不同订单
    GROUP BY o1.user_id, o1.product_id, o2.product_id
    HAVING COUNT(DISTINCT o1.order_id) > 0 AND COUNT(DISTINCT o2.order_id) > 0;
    
  • 性能优化
    使用 CLUSTER BY user_id 预分区,减少 JOIN 时的数据移动。

四、聚合与统计分析

7. 同比 / 环比计算
  • 题目
    计算每月销售额的同比和环比增长率
    表结构sales(sale_date, amount)

  • 参考答案

    WITH monthly_sales AS (SELECT YEAR(sale_date) AS sale_year,MONTH(sale_date) AS sale_month,SUM(amount) AS total_amountFROM salesGROUP BY YEAR(sale_date), MONTH(sale_date)
    ),
    growth_rates AS (SELECT sale_year,sale_month,total_amount,LAG(total_amount, 1) OVER (ORDER BY sale_year, sale_month) AS prev_month_amount,LAG(total_amount, 12) OVER (ORDER BY sale_year, sale_month) AS prev_year_amount,(total_amount - LAG(total_amount, 1)) / LAG(total_amount, 1) AS mom_growth,(total_amount - LAG(total_amount, 12)) / LAG(total_amount, 12) AS yoy_growthFROM monthly_sales
    )
    SELECT sale_year,sale_month,total_amount,ROUND(mom_growth * 100, 2) AS mom_growth_percent,ROUND(yoy_growth * 100, 2) AS yoy_growth_percent
    FROM growth_rates;
    
  • 边界处理
    用 COALESCE() 处理首个月 / 年的 NULL 值:

    COALESCE((total_amount - LAG(total_amount, 1)) / LAG(total_amount, 1), 0) AS mom_growth
    
8. 多维分析(Cube/Rollup)
  • 题目
    同时计算按产品、地区、时间维度的销售额聚合(含小计和总计)。
    表结构sales(product_id, region_id, sale_date, amount)

  • 参考答案

    SELECT product_id,region_id,YEAR(sale_date) AS sale_year,SUM(amount) AS total_amount,GROUPING__ID  -- 0=完整分组,1=按 region 聚合,2=按 product 聚合,3=按 product+region 聚合...
    FROM sales
    GROUP BY product_id, region_id, YEAR(sale_date) 
    WITH CUBE;
    

五、性能优化与高级技巧

9. 数据倾斜处理
  • 题目
    优化以下 SQL,解决数据倾斜问题:

    SELECT u.user_id,COUNT(o.order_id) AS order_count
    FROM users u
    JOIN orders o ON u.user_id = o.user_id
    GROUP BY u.user_id;
    
  • 优化方案

    SET hive.optimize.skewjoin=true;
    SET hive.skewjoin.key=100000;  -- 单个键超过此阈值时触发优化-- 手动分桶 + 聚合
    SELECT user_id,SUM(order_count) AS total_orders
    FROM (SELECT u.user_id,COUNT(o.order_id) AS order_countFROM users uJOIN orders o ON u.user_id = CONCAT(FLOOR(RAND() * 100), '_', o.user_id)  -- 随机前缀GROUP BY u.user_id, FLOOR(RAND() * 100)
    ) t
    GROUP BY user_id;
    
  • 优化点

    • 通过 RAND() 添加随机前缀,分散热点数据。
    • 两阶段聚合:先局部聚合,再全局聚合。
10. UDF 与复杂类型处理
  • 题目
    使用 UDF 解析 JSON 字段,并统计每个用户的平均标签数量
    表结构user_profiles(user_id, tags_json),其中 tags_json 为 JSON 数组(如 ["sports", "music"])。

  • 参考答案

    -- 假设已注册 explode_json_array UDF
    SELECT user_id,AVG(tag_count) AS avg_tags_per_user
    FROM (SELECT user_id,SIZE(explode_json_array(tags_json)) AS tag_countFROM user_profiles
    ) t
    GROUP BY user_id;
    
  • 内置函数替代方案

    SELECT user_id,AVG(tag_count) AS avg_tags
    FROM (SELECT user_id,SIZE(SPLIT(REPLACE(REPLACE(tags_json, '[', ''), ']', ''), ',')) AS tag_countFROM user_profiles
    ) t
    GROUP BY user_id;
    

相关文章:

大数据学习(129)-Hive数据分析

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

React 进阶特性

1. ref ref 是 React 提供的一种机制,用于访问和操作 DOM 元素或 React 组件的实例。它可以用于获取某个 DOM 元素的引用,从而执行一些需要直接操作 DOM 的任务,例如手动设置焦点、选择文本或触发动画。 1.1. 使用 ref 的步骤 1. 创建一个 ref:使用 React.createRef 或 …...

Polarctf2025夏季赛 web java ez_check

第一次自己做出一个java&#xff0c;值得小小的记录&#xff0c;polar的java真得非常友好 反编译jar包&#xff0c;一眼就看到有个/deserialize 路由&#xff0c;接受base64的序列化数据&#xff0c;base64解码后 经过一次kmp检查&#xff0c;再由SafeObjectInputStream来反序列…...

vue3+el-table 利用插槽自定义数据样式

<el-table-column label"匹配度" prop"baseMatchingLevel"><template #default"scope"><div :style"{ color: scope.row.baseMatchingLevel > 0.8 ? #00B578 : #FA5151 }">{{ scope.row.baseMatchingLevel }}&l…...

跑通 TrackNet-Badminton-Tracking-tensorflow2 项目全记录

&#x1f4dd; 跑通 TrackNet-Badminton-Tracking-tensorflow2 项目全记录 git clone https://github.com/Chang-Chia-Chi/TrackNet-Badminton-Tracking-tensorflow2.git TrackNet-Badminton-Tracking-tensorflow2 conda create --prefix /cloud/TrackNet-Badminton-Tracking-…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(八)

uboot启动异常及解决 网络问题及解决 打开STM32CubeMX选中ETH1 - A7NS&#xff08;Linux&#xff09;Mode&#xff1a;RGMII&#xff08;Reduced GMII&#xff09;勾选ETH 125MHz Clock Input修改GPIO引脚如图所示 Net: No ethernet found.生成代码后&#xff0c;修改u-boot下…...

CodeBuddy一腾讯内部已有超过 85% 的程序员正在使用de编程工具

大家好&#xff0c;我是程序员500佰&#xff0c;目前正在前往独立开发路线&#xff0c;我会在这里分享关于编程技术、独立开发、技术资讯以及编程感悟等内容。 如果本文能给你提供启发和帮助&#xff0c;还请留下你的一健三连&#xff0c;给我一些鼓励&#xff0c;谢谢。 本文直…...

PHP 表单 - 验证邮件和URL

PHP 表单 - 验证邮件和URL 引言 在Web开发中&#xff0c;表单是用户与网站交互的重要途径。一个功能完善的表单不仅可以收集用户数据&#xff0c;还能提高用户体验。在表单设计中&#xff0c;验证邮件地址和URL是常见的需求。本文将详细介绍如何在PHP中实现邮件和URL的验证&a…...

leetcode238-除自身以外数组的乘积

leetcode 238 思路 可以在不使用除法的情况下&#xff0c;利用前缀积和后缀积来实现解答 前缀积&#xff1a;对每个位置&#xff0c;计算当前数字左侧的所有数字的乘积后缀积&#xff1a;对每个位置&#xff0c;计算当前数字右侧的所有数字的乘积 结合这两种思想&#xff0…...

论文阅读笔记——Large Language Models Are Zero-Shot Fuzzers

TitanFuzz 论文 深度学习库&#xff08;TensorFlow 和 Pytorch&#xff09;中的 bug 对下游任务系统是重要的&#xff0c;保障安全性和有效性。在深度学习&#xff08;DL&#xff09;库的模糊测试领域&#xff0c;直接生成满足输入语言(例如 Python )语法/语义和张量计算的DL A…...

matlab模糊控制实现路径规划

路径规划是机器人和自动驾驶系统中的重要问题之一&#xff0c;它涉及确定如何在给定环境中找到最优路径以达到特定目标。模糊控制是一种有效的控制方法&#xff0c;可以应用于路径规划问题。 路径规划算法的目标是在避免障碍物的情况下&#xff0c;找到机器人或车辆从起点到终…...

浅谈未来汽车电子电气架构发展趋势中的通信部分

目录 一、引入 1.1市场占比演化 1.2未来发展趋势 二、纯电动汽车与传统汽车的区别 2.1 纯电车和燃油车的架构&#xff08;干货&#xff09; 2.2 新能源汽车的分类 ⚡ 1. 纯电动汽车&#xff08;BEV&#xff09; &#x1f50b; 2. 插电式混合动力&#xff08;PHEV&#…...

基于 Transformer robert的情感分类任务实践总结之二——R-Drop

基于 Transformer robert的情感分类任务实践总结之一 核心改进点 1. R-Drop正则化 原理&#xff1a;通过在同一个输入上两次前向传播&#xff08;利用Dropout的随机性&#xff09;&#xff0c;强制模型对相同输入生成相似的输出分布&#xff0c;避免过拟合。实现&#xff1a…...

个人电脑部署本地大模型+UI

在这个AI飞速进步的时代&#xff0c;越来越多的大模型出现在市面上 本地大模型也越来越火爆&#xff01; 它完全免费&#xff0c;随时可以访问&#xff0c;数据仅存在本地&#xff0c;还可以自己微调&#xff0c;训练&#xff01; 今天我来教大家&#xff0c;如何在一台普通…...

Three.js + Vue3 加载GLB模型项目代码详解

本说明结合 src/App.vue 代码,详细解释如何在 Vue3 项目中用 three.js 加载并显示 glb 模型。 1. 依赖与插件导入 import {onMounted, onUnmounted } from vue import * as THREE from three import Stats from stats.js import {OrbitControls } from three/examples/jsm/co…...

MongoDB $type 操作符详解

MongoDB $type 操作符详解 引言 MongoDB 是一款流行的开源文档型数据库,它提供了丰富的查询操作符来满足不同的数据查询需求。在 MongoDB 中,$type 操作符是一个非常有用的查询操作符,它允许用户根据文档中字段的类型来查询文档。本文将详细介绍 MongoDB 的 $type 操作符,…...

Vue3项目实现WPS文件预览和内容回填功能

技术方案背景&#xff1a;根据项目需要&#xff0c;要实现在线查看、在线编辑文档&#xff0c;并且进行内容的快速回填&#xff0c;根据这一项目背景&#xff0c;最终采用WPS的API来实现&#xff0c;接下来我们一起来实现项目功能。 1.首先需要先准备好测试使用的文档&#xf…...

PySide6 GUI 学习笔记——常用类及控件使用方法(多行文本控件QTextEdit)

文章目录 PySide6.QtWidgets.QTextEdit 应用举例概述核心特性常用方法文本内容操作光标和选择操作格式和样式查找功能视图控制状态设置常用信号 代码示例示例说明1. 基本设置2. 文本格式化功能3. 功能按钮4. 信号处理 PySide6.QtWidgets.QTextEdit 应用举例 概述 QTextEdit 是…...

【版本控制】Git 和 GitHub 入门教程

目录 0 引言1 Git与GitHub的诞生1.1 Git&#xff1a;Linus的“两周奇迹”&#xff0c;拯救Linux内核1.2 GitHub&#xff1a;为Git插上协作的翅膀1.3 协同进化&#xff1a;从工具到生态的质变1.4 关键历程时间轴&#xff08;2005–2008&#xff09; 2 Git与GitHub入门指南2.1 Gi…...

上位机知识篇---Flask框架实现Web服务

本文将简单介绍Web 服务与前端显示部分&#xff0c;它们基于Flask 框架和HTML/CSS/JavaScript实现&#xff0c;主要负责将实时视频流和检测结果通过网页展示&#xff0c;并提供交互式状态监控。以下是详细技术解析&#xff1a; 一、Flask Web 服务架构 1. 核心路由设计 app.…...

django paramiko 跳转登录

在使用Django框架结合Paramiko进行SSH远程操作时&#xff0c;通常涉及到自动化脚本的执行&#xff0c;比如远程服务器上的命令执行、文件传输等。如果你的需求是“跳转登录”&#xff0c;即在登录远程服务器后&#xff0c;再通过该服务器的SSH连接跳转到另一台服务器&#xff0…...

Prompt工程学习之思维树(TOT)

思维树 定义&#xff1a;思维树&#xff08;Tree of Thoughts, ToT&#xff09; 是一种先进的推理框架&#xff0c;它通过同时探索多条推理路径对思维链&#xff08;Chain of Thought&#xff09;** 进行了扩展。该技术将问题解决视为一个搜索过程 —— 模型生成不同的中间步骤…...

基于python大数据的水文数据分析可视化系统

博主介绍&#xff1a;高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实实在…...

人工智能学习09-变量作用域

人工智能学习概述—快手视频 人工智能学习09-变量作用域—快手视频...

DJango知识-模型类

一.项目创建 在想要将项目创键的目录下,输入cmd (进入命令提示符)在cmd中输入:Django-admin startproject 项目名称 (创建项目)cd 项目名称 (进入项目)Django-admin startapp 程序名称 (创建程序)python manage.py runserver 8080 (运行程序)将弹出的网址复制到浏览器中…...

结构性-代理模式

动态代理主要是为了处理重复创建模板代码的场景。 使用示例 public interface MyInterface {String doSomething(); }public class MyInterfaceImpl implements MyInterface{Overridepublic String doSomething() {return "接口方法dosomething";} }public class M…...

【Redis】笔记|第10节|京东HotKey实现多级缓存架构

缓存架构 京东HotKey架构 代码结构 代码详情 功能点&#xff1a;&#xff08;如代码有错误&#xff0c;欢迎讨论纠正&#xff09; 多级缓存&#xff0c;先查HotKey缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新…...

Java中Git基础操作详解(clone、commit、push、branch)

Git是Java开发者必备的版本控制工具&#xff0c;以下是核心操作的详细说明及示例&#xff1a; ​​一、Git基础概念​​ ​​仓库&#xff08;Repository&#xff09;​​&#xff1a;存储代码的目录&#xff0c;包含所有版本历史。​​提交&#xff08;Commit&#xff09;​​…...

基于规则的自然语言处理

基于规则的自然语言处理 规则方法形态还原&#xff08;针对英语、德语、法语等&#xff09;中文分词切分歧义分词方法歧义字段消歧方法分词带来的问题 词性标注命名实体分类机器翻译规则方法的问题 规则方法 以规则形式表示语言知识&#xff0c;强调人对语言知识的理性整理&am…...

使用MounRiver Studio Ⅱ软件写一个CH592F芯片的ADC采集程序,碰到的问题

MounRiver Studio Ⅱ 默认是不开启浮点计算的&#xff0c;所以有些浮点功能不能用&#xff0c;碰到问题是 while (1) {DelayMs (100);tmp Read_Temperature (0);sprintf (tempBuffer, "temp:%.2f\r\n", tmp); // 格式化温度值到字符串。使用%f要开启相应的…...