Hive级联求和


  • 建表
    CREATE TABLE t_salary_detail(
    username string,
    month string,
    salary INT )
    ROW format delimited FIELDS TERMINATED BY ',';
  • 导入数据
    LOAD DATA LOCAL inpath '/export/servers/hivedatas/click-part-r-00000' INTO TABLE t_salary_detail;
    +---------------------------+------------------------+-------------------------+--+
    | t_salary_detail.username | t_salary_detail.month | t_salary_detail.salary |
    +---------------------------+------------------------+-------------------------+--+
    | A | 2015-01 | 5 |
    | A | 2015-01 | 15 |
    | B | 2015-01 | 5 |
    | A | 2015-01 | 8 |
    | B | 2015-01 | 25 |
    | A | 2015-01 | 5 |
    | A | 2015-02 | 4 |
    | A | 2015-02 | 6 |
    | B | 2015-02 | 10 |
    | B | 2015-02 | 5 |
    | A | 2015-03 | 7 |
    | A | 2015-03 | 9 |
    | B | 2015-03 | 11 |
    | B | 2015-03 | 6 |
    +---------------------------+------------------------+-------------------------+--+

  • 思路

    累积求和其实就是通过inner join表本身来实现。首先要先明白 统计每个用户每个月总共获得多少小费 的hql语句怎么写
    SELECT username,month,sum(salary)
    FROM t_salary_detail
    GROUP BY username,month;
    +-----------+----------+------+--+
    | username | month | _c2 |
    +-----------+----------+------+--+
    | A | 2015-01 | 33 |
    | A | 2015-02 | 10 |
    | A | 2015-03 | 16 |
    | B | 2015-01 | 30 |
    | B | 2015-02 | 15 |
    | B | 2015-03 | 17 |
    +-----------+----------+------+--+

    现在通过inner join连接自己

    SELECT a.*,b.*
    FROM (
    SELECT username,month,sum(salary)
    FROM t_salary_detail
    GROUP BY username,month ) a
    INNER JOIN (
    SELECT username,month,sum(salary)
    FROM t_salary_detail
    GROUP BY username,month ) b
    ON a.username = b.username;
    +-------------+----------+--------+-------------+----------+--------+--+
    | a.username | a.month | a._c2 | b.username | b.month | b._c2 |
    +-------------+----------+--------+-------------+----------+--------+--+
    | A | 2015-01 | 33 | A | 2015-01 | 33 |
    | A | 2015-01 | 33 | A | 2015-02 | 10 |
    | A | 2015-01 | 33 | A | 2015-03 | 16 |
    | A | 2015-02 | 10 | A | 2015-01 | 33 |
    | A | 2015-02 | 10 | A | 2015-02 | 10 |
    | A | 2015-02 | 10 | A | 2015-03 | 16 |
    | A | 2015-03 | 16 | A | 2015-01 | 33 |
    | A | 2015-03 | 16 | A | 2015-02 | 10 |
    | A | 2015-03 | 16 | A | 2015-03 | 16 |
    | B | 2015-01 | 30 | B | 2015-01 | 30 |
    | B | 2015-01 | 30 | B | 2015-02 | 15 |
    | B | 2015-01 | 30 | B | 2015-03 | 17 |
    | B | 2015-02 | 15 | B | 2015-01 | 30 |
    | B | 2015-02 | 15 | B | 2015-02 | 15 |
    | B | 2015-02 | 15 | B | 2015-03 | 17 |
    | B | 2015-03 | 17 | B | 2015-01 | 30 |
    | B | 2015-03 | 17 | B | 2015-02 | 15 |
    | B | 2015-03 | 17 | B | 2015-03 | 17 |
    +-------------+----------+--------+-------------+----------+--------+--+

    得到以上结果可以看出,我们可以利用b表的salary列来进行累积求和,因为我们要求每个用户每个月总共获得小费,到2月份是要将2月和前一个月的小费累计,也就是表中33,33+10,33+10+16这样

    SELECT a.*,b.*
    FROM (
    SELECT username,month,sum(salary)
    FROM t_salary_detail
    GROUP BY username,month ) a
    INNER JOIN (
    SELECT username,month,sum(salary)
    FROM t_salary_detail
    GROUP BY username,month ) b
    ON a.username = b.username
    WHERE b.month <= a.month;
    +-------------+----------+--------+-------------+----------+--------+--+
    | a.username | a.month | a._c2 | b.username | b.month | b._c2 |
    +-------------+----------+--------+-------------+----------+--------+--+
    | A | 2015-01 | 33 | A | 2015-01 | 33 |
    | A | 2015-02 | 10 | A | 2015-01 | 33 |
    | A | 2015-02 | 10 | A | 2015-02 | 10 |
    | A | 2015-03 | 16 | A | 2015-01 | 33 |
    | A | 2015-03 | 16 | A | 2015-02 | 10 |
    | A | 2015-03 | 16 | A | 2015-03 | 16 |
    | B | 2015-01 | 30 | B | 2015-01 | 30 |
    | B | 2015-02 | 15 | B | 2015-01 | 30 |
    | B | 2015-02 | 15 | B | 2015-02 | 15 |
    | B | 2015-03 | 17 | B | 2015-01 | 30 |
    | B | 2015-03 | 17 | B | 2015-02 | 15 |
    | B | 2015-03 | 17 | B | 2015-03 | 17 |
    +-------------+----------+--------+-------------+----------+--------+--+

    得到以上结果后,只需要按照Month分组,对salary列用SUM函数即可

    SELECT SUM(bSalSum)
    FROM (
    SELECT a.month AS aMonth,a.username AS aUser,a.salSum AS aSalSum,
    b.month AS bMonth,b.username AS bUser,b.salSum AS bSalSum
    FROM (
    SELECT month,username,SUM(salary) AS salSum
    FROM t_salary_detail
    GROUP BY username,month ) a
    INNER JOIN (
    SELECT month,username,SUM(salary) AS salSum
    FROM t_salary_detail
    GROUP BY username,month ) b
    ON a.username = b.username
    WHERE b.month <= a.month ) t
    GROUP BY aUser,aMonth;
    +------+--+
    | _c0 |
    +------+--+
    | 33 |
    | 43 |
    | 59 |
    | 30 |
    | 45 |
    | 62 |
    +------+--+

【Hadoop离线基础总结】Hive级联求和的更多相关文章

  1. 【Hadoop离线基础总结】Hive调优手段

    Hive调优手段 最常用的调优手段 Fetch抓取 MapJoin 分区裁剪 列裁剪 控制map个数以及reduce个数 JVM重用 数据压缩 Fetch的抓取 出现原因 Hive中对某些情况的查询不 ...

  2. 【Hadoop离线基础总结】流量日志分析网站整体架构模块开发

    目录 数据仓库设计 维度建模概述 维度建模的三种模式 本项目中数据仓库的设计 ETL开发 创建ODS层数据表 导入ODS层数据 生成ODS层明细宽表 统计分析开发 流量分析 受访分析 访客visit分 ...

  3. 【Hadoop离线基础总结】oozie的安装部署与使用

    目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...

  4. 【Hadoop离线基础总结】Hue的简单介绍和安装部署

    目录 Hue的简单介绍 概述 核心功能 安装部署 下载Hue的压缩包并上传到linux解压 编译安装启动 启动Hue进程 hue与其他框架的集成 Hue与Hadoop集成 Hue与Hive集成 Hue ...

  5. 【Hadoop离线基础总结】impala简单介绍及安装部署

    目录 impala的简单介绍 概述 优点 缺点 impala和Hive的关系 impala如何和CDH一起工作 impala的架构及查询计划 impala/hive/spark 对比 impala的安 ...

  6. 【Hadoop离线基础总结】Sqoop常用命令及参数

    目录 常用命令 常用公用参数 公用参数:数据库连接 公用参数:import 公用参数:export 公用参数:hive 常用命令&参数 从关系表导入--import 导出到关系表--expor ...

  7. Hadoop(分布式系统基础架构)---Hive与HBase区别

    对于刚接触大数据的用户来说,要想区分Hive与HBase是有一定难度的.本文将尝试从其各自的定义.特点.限制.应用场景等角度来进行分析,以作抛砖引玉之用.  Hive是什么? Apache Hive是 ...

  8. 【Hadoop离线基础总结】Hue与Hive集成

    目录 1.更改hue的配置hue.ini 2.启动hive的metastore以及hiveserver2服务 3.启动hue进程,查看Hive是否与Hue集成成功 1.更改hue的配置hue.ini ...

  9. 【Hadoop离线基础总结】Hive的基本操作

    Hive的基本操作 创建数据库与创建数据库表 创建数据库的相关操作 创建数据库:CREATE TABLE IF NOT EXISTS myhive hive创建表成功后的存放位置由hive-site. ...

随机推荐

  1. 第九节:os、sys、json、pickle、shelve模块

    OS模块: os.getcwd()获取当前路径os.chdir()改变目录os.curdir返回当前目录os.pardir()父目录os.makedirs('a/b/c')创建多层目录os.remov ...

  2. 修改vs默认浏览器

    右键你的Html或者网页项目,选择"使用以下工具浏览" 跳出选择框,选择你想要的浏览器作为默认值即可,也可以添加你想要的浏览器.

  3. 抠脚大叔如何改变性别,Python实现变声器功能

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 乔柯 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  4. 带权值的图 BFS

    用bfs遍历最图求最短路径时通常借用优先队列即优先考虑最大的或者最小的权值 方法1 优先队列:(内置函数,优先考虑较小的权值) #include<iostream> #include< ...

  5. 今天我们来讨论一下display和visibility两个CSS属性。

    在讨论着两个属性之前我们先来看看HTML标签的全局属性.就是可以直接在HTML标签上直接写的属性. 以下是菜鸟教程的截图: 1.看以下第一个快捷键的属性accesskey;设置的就不多说了.主要就是2 ...

  6. 详解JS闭包概念

    闭包理解 1.  如何产生闭包?    *当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,产生闭包 2.  闭包到底是什么?    * 使用Chrome调试查看    * 理解一 ...

  7. 12. 前后端联调 + ( proxy代理 ) + ( axios拦截器 ) + ( css Modules模块化方案 ) + ( css-loader ) + ( 非路由组件如何使用history ) + ( bodyParser,cookieParser中间件 ) + ( utility MD5加密库 ) + ( nodemon自动重启node ) + +

    (1) proxy 前端的端口在:localhost:3000后端的端口在:localhost:1234所以要在webpack中配置proxy选项 (proxy是代理的意思) 在package.jso ...

  8. 【高频 Redis 面试题】Redis 事务是否具备原子性?

    一.Redis 事务的实现原理 一个事务从开始到结束通常会经历以下三个阶段: 1.事务开始 客户端发送 MULTI 命令,服务器执行 MULTI 命令逻辑. 服务器会在客户端状态(redisClien ...

  9. 轻量级mysql安装教程-避免采坑

    1:安装包获取 安装了很多次,来来回回踩,踩出了一片光明大道,简单好用. 百度网盘获取:链接:https://pan.baidu.com/s/13frFBTODaMeADZOHj5KdJQ 提取码:a ...

  10. springmvc返回不带引号的字符串

    springmvc返回不带引号的字符串项目使用springboot开发的,大部分出参为json,使用的fastJson,现在有的接口需要返回一个success字符串,发现返回结果为“success”, ...