SQL编写一般思路:

1)复杂的查询,先划分为小任务,以降低难度。分别实现各个小任务后,再进行汇总;
2)涉及多表时,先进行联表查询;
3)简单分组,一般只需要group by即可;
4)组内TopN问题,使用row_number,rank,dense_rank;
5)熟练掌握常用函数;

1. 常用函数

1)字符串

split,分割字符串为数组,split(“a|b|c”, “\|”) => 返回数组 [a, b, c]

参数1:待分割到字符串;

参数2:分割字符,因为"|“在Java中是特殊字符,所以需要进行转义,转义使用两个”";

substr,取子字符串,substr(moviename, -5, 4)

参数1:原字符串;

参数2:截取的开始位置,如果是负数,则从右往左计数,如-1表示最后一个字符,-2表示倒数第二个字符;

参数3:截取长度;

示例:
0: jdbc:hive2://master:10000> select *, substr(moviename, -5, 4) as year from t_movie limit 5;
+------------------+-------------------------------------+-------------------------------+-------+
| t_movie.movieid | t_movie.moviename | t_movie.movietype | year |
+------------------+-------------------------------------+-------------------------------+-------+
| 1 | Toy Story (1995) | Animation|Children's|Comedy | 1995 |
| 2 | Jumanji (1995) | Adventure|Children's|Fantasy | 1995 |
| 3 | Grumpier Old Men (1995) | Comedy|Romance | 1995 |
| 4 | Waiting to Exhale (1995) | Comedy|Drama | 1995 |
| 5 | Father of the Bride Part II (1995) | Comedy | 1995 |
+------------------+-------------------------------------+-------------------------------+-------+

2)时间函数

year,获取时间的年份;

month,获取时间的月份;

from_unixtime,将时间戳转换为时间;

unix_timestamp():获取当前时间戳;

unix_timestamp(string date):时间转换为时间戳;

获取当前日期 & 时间:
当前日期:
0: jdbc:hive2://master:10000> select current_date();
+-------------+
| _c0 |
+-------------+
| 2019-09-21 |
+-------------+
当前时间:
0: jdbc:hive2://master:10000> select current_timestamp();
+--------------------------+
| _c0 |
+--------------------------+
| 2019-09-21 18:05:27.768 |
+--------------------------+
当前时间戳:
0: jdbc:hive2://master:10000> select unix_timestamp();
+-------------+
| _c0 |
+-------------+
| 1569060416 |
+-------------+ 从时间中获取年份:
0: jdbc:hive2://master:10000> select year("2019-09-21 18:05:27.768 ") as year;
+-------+
| year |
+-------+
| 2019 |
+-------+ 从时间戳中获取月份:
0: jdbc:hive2://master:10000> select month(from_unixtime(1569060416)) as month;
+--------+
| month |
+--------+
| 9 |
+--------+

3)聚合函数

sum、avg等;

4)explode

将数组等拆分为多行

0: jdbc:hive2://master:10000> select m.*, t.type from t_movie m lateral view explode(split(movietype, "\\|")) t as type limit 10;
+------------+---------------------------+-------------------------------+-------------+
| m.movieid | m.moviename | m.movietype | t.type |
+------------+---------------------------+-------------------------------+-------------+
| 1 | Toy Story (1995) | Animation|Children's|Comedy | Animation |
| 1 | Toy Story (1995) | Animation|Children's|Comedy | Children's |
| 1 | Toy Story (1995) | Animation|Children's|Comedy | Comedy |
| 2 | Jumanji (1995) | Adventure|Children's|Fantasy | Adventure |
| 2 | Jumanji (1995) | Adventure|Children's|Fantasy | Children's |
| 2 | Jumanji (1995) | Adventure|Children's|Fantasy | Fantasy |
| 3 | Grumpier Old Men (1995) | Comedy|Romance | Comedy |
| 3 | Grumpier Old Men (1995) | Comedy|Romance | Romance |
| 4 | Waiting to Exhale (1995) | Comedy|Drama | Comedy |
| 4 | Waiting to Exhale (1995) | Comedy|Drama | Drama |
+------------+---------------------------+-------------------------------+-------------+

5)collect_set,可以理解为该函数实现了explode相反到功能;

collect_list:可以包含重复数据;collect_set:去重;

将多行某字段到数据,合并为一个数组,需要结合group by进行分组,以确定合并到行到范围。

0: jdbc:hive2://master:10000> select moviename, collect_set(type) as types from (select m.*, t.type from t_movie m lateral view explode(split(movietype, "\\|")) t as type limit 10) t group by moviename;
+---------------------------+---------------------------------------+
| moviename | types |
+---------------------------+---------------------------------------+
| Jumanji (1995) | ["Children's","Adventure","Fantasy"] |
| Toy Story (1995) | ["Comedy","Children's","Animation"] |
| Grumpier Old Men (1995) | ["Comedy","Romance"] |
| Waiting to Exhale (1995) | ["Drama","Comedy"] |
+---------------------------+---------------------------------------+

2. 常见场景及方法

2. 常见场景及方法
1)简单条件过滤;
使用where,显示movieid为1到电影名:
0: jdbc:hive2://master:10000> select moviename from t_movie where movieid = 1;
+-------------------+
| moviename |
+-------------------+
| Toy Story (1995) |
+-------------------+ 2)联表条件过滤;
使用join on,获取评分为5的电影名:
select moviename, rate from t_rating r join t_movie m on r.movieid=m.movieid where rate=5 limit 5;
+-----------------------------------------+-------+
| moviename | rate |
+-----------------------------------------+-------+
| One Flew Over the Cuckoo's Nest (1975) | 5.0 |
| Bug's Life, A (1998) | 5.0 |
| Ben-Hur (1959) | 5.0 |
| Christmas Story, A (1983) | 5.0 |
| Beauty and the Beast (1991) | 5.0 |
+-----------------------------------------+-------+ 3)分组统计;
使用group by和聚合函数
获取电影的平均评分:
select movieid, avg(rate) avg_rate from t_rating group by movieid order by movieid limit 5;
+----------+---------------------+
| movieid | avg_rate |
+----------+---------------------+
| 1 | 4.146846413095811 |
| 2 | 3.20114122681883 |
| 3 | 3.01673640167364 |
| 4 | 2.7294117647058824 |
| 5 | 3.0067567567567566 |
+----------+---------------------+ 4)组内TopN;
使用row_number,rank,dense_rank;
获取各部门工资最高的三名员工:
select * from (select deptid, name, (salary+nvl(bonus, 0)) salary, dense_rank() over(partition by deptid order by salary desc) as rank from emp) t where rank<=3;
+-----------+---------+-----------+---------+
| t.deptid | t.name | t.salary | t.rank |
+-----------+---------+-----------+---------+
| 10 | KING | 5000.0 | 1 |
| 10 | CLARK | 2450.0 | 2 |
| 10 | MILLER | 1300.0 | 3 |
| 20 | FORD | 3000.0 | 1 |
| 20 | SCOTT | 3000.0 | 1 |
| 20 | JONES | 2975.0 | 2 |
| 20 | ADAMS | 1100.0 | 3 |
| 30 | BLAKE | 2850.0 | 1 |
| 30 | ALLEN | 1900.0 | 2 |
| 30 | TURNER | 1500.0 | 3 |
+-----------+---------+-----------+---------+ 5)累加;
使用sum() over(partition by order by)
获取每个人按月累计消费:
select name, dt, cost, sum(cost) over(partition by name, month(dt) order by cost) as sum from t_order order by name;
+-------+-------------+-------+------+
| name | dt | cost | sum |
+-------+-------------+-------+------+
| jack | 2015-01-01 | 10 | 10 |
| jack | 2015-01-05 | 46 | 56 |
| jack | 2015-01-08 | 55 | 111 |
| jack | 2015-02-03 | 23 | 23 |
| jack | 2015-04-06 | 42 | 42 |
| mart | 2015-04-08 | 62 | 62 |
| mart | 2015-04-09 | 68 | 130 |
| mart | 2015-04-11 | 75 | 205 |
| mart | 2015-04-13 | 94 | 299 | 注意,如果over语句中没有order by,则求取的是该月份的消费总金额,而不会出现累加。
select name, dt, cost, sum(cost) over(partition by name, month(dt)) as sum from t_order order by name;
+-------+-------------+-------+------+
| name | dt | cost | sum |
+-------+-------------+-------+------+
| jack | 2015-01-01 | 10 | 111 |
| jack | 2015-01-05 | 46 | 111 |
| jack | 2015-01-08 | 55 | 111 |
| jack | 2015-02-03 | 23 | 23 |
| jack | 2015-04-06 | 42 | 42 |
| mart | 2015-04-08 | 62 | 299 |
| mart | 2015-04-09 | 68 | 299 |
| mart | 2015-04-11 | 75 | 299 |
| mart | 2015-04-13 | 94 | 299 |

【HIVE】数据分析HQL的编写方法/思路的更多相关文章

  1. Hive设置配置参数的方法,列举8个常用配置

    Hive设置配置参数的方法 Hive提供三种可以改变环境变量的方法,分别是: (1).修改${HIVE_HOME}/conf/hive-site.xml配置文件: (2).命令行参数: (3).在已经 ...

  2. 【深入浅出 Yarn 架构与实现】3-1 Yarn Application 流程与编写方法

    本篇学习 Yarn Application 编写方法,将带你更清楚的了解一个任务是如何提交到 Yarn ,在运行中的交互和任务停止的过程.通过了解整个任务的运行流程,帮你更好的理解 Yarn 运作方式 ...

  3. AJAX的get和post请求原生编写方法

    var xhr=new XMLHttpRequest(); xhr.onreadystatechange=function(){ if(xhr.readyState===4){ if(xhr.stat ...

  4. moodle中的完形填空题的文本编写方法

    moodle中的完形填空题的文本编写方法 [完形填空题]考题把一段文字挖去一些空,让考生根据上下文正确地完成这些填空.完型填空题中的一段短文可以包括各种题目,如选择,填空,和数字题等. 题目的编辑是在 ...

  5. Hive性能分析和优化方法

    Hive性能分析和优化方法 http://wenku.baidu.com/link?url=LVrnj-mD0OB69-eUH-0b2LGzc2SN76hjLVsGfCdYjV8ogyyN-BSja5 ...

  6. DLL DEF文件编写方法 VC++ 调用、调试DLL的方法 显式(静态)调用、隐式(动态)调用

    DLL 文件编写方法: 1.建立DLL工程 2.声明.定义要导出的函数 BOOL WINAPI InitDlg( HWND hTabctrl,TShareMem* pTshare,CRect* prc ...

  7. Hive的HQL(2)

    Hive基础(1) Hive的HQL(2) 1. HQL的数据定义,HQL是一种SQL方言,支持绝大部分SQL-92标准.但是和SQL的差异为:不支持行级别的操作,不支持事务等.HQL的语法接近于My ...

  8. Flutter实战视频-移动电商-38.路由_Fluro中Handler编写方法

    38.路由_Fluro中Handler编写方法 在main.dart中初始化Fluro 编写handler 在lib下新建routers文件夹,表示里面要很多路由相关的文件 我们声明一个Handler ...

  9. fMRI数据分析处理原理及方法————转自网络

    fMRI数据分析处理原理及方法 来源: 整理文件的时候翻到的,来源已经找不到了囧感觉写得还是不错,贴在这里保存. 近年来,血氧水平依赖性磁共振脑功能成像(Blood oxygenation level ...

随机推荐

  1. Java 常用API(一)

    目录 Java 常用API(一) 1. Scanner类 引用类型的一般使用步骤 Scanner的使用步骤 例题 2. 匿名对象 概述 匿名对象作为方法的参数 匿名对象作为方法的返回值 3. Rand ...

  2. Linux dts 设备树详解(一) 基础知识

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 1 前言 2 概念 2.1 什么是设备树 dts(device tree)? 2. ...

  3. [vijos P1008 篝火晚会]置换

    题意:编号1-n的小朋友依次围成一圈,给定目标状态每个小朋友左右两边的小朋友编号,每次可以选择编号为[b1,b2,...,bm]的小朋友,作1次轮换,bi是任意编号,代价为m.求变成目标状态所需的最小 ...

  4. C# Html转pdf文件

    using iTextSharp.text; using iTextSharp.text.pdf; using System; using System.Collections.Generic; us ...

  5. python unittest TestCase间共享数据(全局变量的使用)

    文章目录 1.setupclass里设置self.xxx变量,不同用例之间无法实时共享参数变动 2.setupclass里设置globals().["xxx"]变量,不同用例之间可 ...

  6. Appium自动化(9) - appium元素定位的快速入门

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 快速入门栗子:boss直聘 app ...

  7. babel转码时generator的regeneratorRuntime

    今天写generator函数时发现出错:regeneratorRuntime. 在stackoverflow网友说需是本地babel软件包没有安装完全. package.json: "dev ...

  8. java触发器的学习

         public class OpenVirtualService {             public void open(){ //虚机开通                //业务逻辑 ...

  9. Docker镜像下载及加速器设置

    docker远程仓库配置: vim ~/.docker/daemon.json { "registry-mirrors" : [ "https://registry.do ...

  10. Linux内存屏障浅析

    根据该文章整理 https://blog.csdn.net/myxmu/article/details/8035025 1 解决的问题 内存屏障主要解决了单处理器下的乱序问题和多处理器下的内存同步问题 ...