(五)Hive常用函数示例

404NotFound
• 阅读 1142

1 CASE WHEN

示例 我们有这样一组数据

  • data1.txt
id    name    dept    project
1001    zhangsan    sale    A
1002    lisi    sale    A
1003    wangwu    IT    B
1004    zhaoliu    IT    A
1004    zhaosi    sale    B    

求出 每个部门参加a、b项目各有多少人?

创建表

create table emp_pro(
id int,
name string,
dept string,
project string)
row format delimited fields terminated by "\t";

导入数据

load data local inpath into '/home/v2admin/demo/demo1.txt' into table emp_pro;

查看下我们的表的内容

+-------------+---------------+---------------+------------------+
| emp_pro.id  | emp_pro.name  | emp_pro.dept  | emp_pro.project  |
+-------------+---------------+---------------+------------------+
| 1001        | zhangsan      | sale          | A                |
| 1002        | lisi          | sale          | A                |
| 1003        | wangwu        | IT            | B                |
| 1004        | zhaoliu       | IT            | A                |
| 1004        | zhaosi        | sale          | B                |
+-------------+---------------+---------------+------------------+

创建表和导入数据没有问题,接下来开始实现我们的需求

select 
dept,
sum(case project when "A" then 1 else 0 end)  A_Count,
sum(case project when "B"  then 1 else 0 end)  B_Count
from emp_pro
group by dept;

结果

+-------+----------+----------+
| dept  | a_count  | b_count  |
+-------+----------+----------+
| IT    | 1        | 1        |
| sale  | 2        | 1        |
+-------+----------+----------+

2.CONCAT、CONCAT_WS、COLLECT_SET(col)

函数说明
CONCAT(string A/col, string B/col…)返回输入字符串连接后的结果,支持任意个输入字符串;
CONCAT_WS(separator, str1, str2,...)它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
COLLECT_SET(col)函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

示例如下
还是这个数据

  • data1.txt
id    name    dept    project
1001    zhangsan    sale    A
1002    lisi    sale    A
1003    wangwu    IT    B
1004    zhaoliu    IT    A
1004    zhaosi    sale    B    

我们要得到如下结果

sale,A    zhangsan,lisi
sale,B    zhaosi
IT,A    zhaoliu
IT,B    wangwu

查询语句

select 
t1.bs,
concat_ws("|",collect_set(t1.name)) name
from(
select name,concat(dept,",",project) bs from emp_pro)  t1
group by t1.bs;

结果

+---------+----------------+
|  t1.bs  |      name      |
+---------+----------------+
| IT,A    | zhaoliu        |
| IT,B    | wangwu         |
| sale,A  | zhangsan|lisi  |
| sale,B  | zhaosi         |
+---------+----------------+

3 EXPOLODE(col)和LATERAL VIEW

函数说明
EXPLODE(col)将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合,例如 LATERAL VIEW udtf(expression) tableAlias AS columnAlias

示例
有这样一组数据

书名            标签
Python核心编程    开发、后台、编程、python
Java编程与进阶    开发、编程、Java
MYSQL实战        数据库、SQL

我们想得到展开的数据

Python核心编程    开发
Python核心编程    后台
Python核心编程    编程
Python核心编程    python
Java编程与进阶    开发
Java编程与进阶    编程
Java编程与进阶    Java
MYSQL实战    数据库
MYSQL实战    SQL

首先准备数据data2.txt

Python核心编程    开发、后台、编程、python
Java编程与进阶    开发、编程、Java
MYSQL实战    数据库、SQL

创建表并导入数据

-- 创建表
create table book_info(
book_name string,
category string)
row format delimited fields terminated by "\t";

-- 导入数据
load data local inpath "/home/v2admin/demo/data2.txt" into table book_info;

查看下表的数据

+----------------------+---------------------+
| book_info.book_name  | book_info.category  |
+----------------------+---------------------+
| Python核心编程           | 开发、后台、编程、python     |
| Java编程与进阶            | 开发、编程、Java          |
| MYSQL实战              | 数据库、SQL             |
+----------------------+---------------------+

Ok,接下来实现我们的需求

select
book_info.book_name,
tb.cate
from book_info
lateral view
explode(split(category, "、")) tb as cate;

结果

+----------------------+-----------+
| book_info.book_name  | tbl.cate  |
+----------------------+-----------+
| Python核心编程           | 开发        |
| Python核心编程           | 后台        |
| Python核心编程           | 编程        |
| Python核心编程           | python    |
| Java编程与进阶            | 开发        |
| Java编程与进阶            | 编程        |
| Java编程与进阶            | Java      |
| MYSQL实战              | 数据库       |
| MYSQL实战              | SQL       |
+----------------------+-----------+

4.开窗函数(也叫窗口函数)

4.1 函数说明

函数说明
OVER()指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。
CURRENT ROW当前行
n PRECEDING前n行数据
n FOLLOWING后n行数据
UNBOUNDED起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点
LAG(col,n,default_val)往前第n行数据
LEAD(col,n, default_val)往后第n行数据
NTILE(n)把有序窗口的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。

过一下即可,等看示例的时候,再对照着看

4.2 示例

1) 老套路,先上数据
姓名 日期 消费

# 姓名    日期    消费
zhangsan    2017-01-01    10
zhangsan    2017-01-02    15
wangwu    2017-02-03    23
wangwu    2017-01-04    29
zhaoliu    2017-01-05    46
zhaoliu    2017-04-06    42
wangwu    2017-01-07    50
zhangsan    2017-01-08    55
zhangsan    2017-04-08    62
wangwu    2017-04-09    68
zaholiu    2017-05-10    12
zhouzhou    2017-04-11    75
zhouzhou    2017-04-13    94

保存文件data3.txt

2)创建表并导入数据

-- 创建表
create table log_info(
name string,
log_date string,
cost int)
row format delimited fields terminated by "\t";

-- 导入数据
load data local inpath "/home/v2admin/demo/data3.txt" into table log_info;

3)需求一: 查询2017年4月份消费过的用户和用户总数

-- over() 不加参数,表示整张表开个窗口
select
name,
count(*) over() as count
from log_info
where substring(log_date,1,7) = '2017-04'
group by name;

结果

+-----------+--------+
|   name    | count  |
+-----------+--------+
| wangwu    | 4      |
| zhangsan  | 4      |
| zhaoliu   | 4      |
| zhouzhou  | 4      |
+-----------+--------+

4)需求2 查询用户的消费明细和每月消费总额

select
name,
log_date,
cost,
sum(cost) over(partition by month(log_date))
from log_info;

结果

+-----------+-------------+-------+---------------+
|   name    |  log_date   | cost  | sum_window_0  |
+-----------+-------------+-------+---------------+
| zhangsan  | 2017-01-01  | 10    | 205           |
| zhangsan  | 2017-01-02  | 15    | 205           |
| wangwu    | 2017-01-04  | 29    | 205           |
| zhaoliu   | 2017-01-05  | 46    | 205           |
| wangwu    | 2017-01-07  | 50    | 205           |
| zhangsan  | 2017-01-08  | 55    | 205           |
| wangwu    | 2017-02-03  | 23    | 23            |
| zhouzhou  | 2017-04-11  | 75    | 341           |
| zhouzhou  | 2017-04-13  | 94    | 341           |
| zhangsan  | 2017-04-08  | 62    | 341           |
| wangwu    | 2017-04-09  | 68    | 341           |
| zhaoliu   | 2017-04-06  | 42    | 341           |
| zaholiu   | 2017-05-10  | 12    | 12            |
+-----------+-------------+-------+---------------+

5)需求3 查询用户上次的消费日期

select
name,
log_date,
cost,
lag(log_date,2) over (partition by name order by log_date) as last_time
from log_info;

结果

+-----------+-------------+-------+-------------+
|   name    |  log_date   | cost  |  last_time  |
+-----------+-------------+-------+-------------+
| wangwu    | 2017-01-04  | 29    | NULL        |
| wangwu    | 2017-01-07  | 50    | NULL        |
| wangwu    | 2017-02-03  | 23    | 2017-01-04  |
| wangwu    | 2017-04-09  | 68    | 2017-01-07  |
| zaholiu   | 2017-05-10  | 12    | NULL        |
| zhangsan  | 2017-01-01  | 10    | NULL        |
| zhangsan  | 2017-01-02  | 15    | NULL        |
| zhangsan  | 2017-01-08  | 55    | 2017-01-01  |
| zhangsan  | 2017-04-08  | 62    | 2017-01-02  |
| zhaoliu   | 2017-01-05  | 46    | NULL        |
| zhaoliu   | 2017-04-06  | 42    | NULL        |
| zhouzhou  | 2017-04-11  | 75    | NULL        |
| zhouzhou  | 2017-04-13  | 94    | NULL        |
+-----------+-------------+-------+-------------+

4.日期函数

1)current_date返回当前日期

0: jdbc:hive2://hadoop10:10000> select current_date();
+-------------+
|     _c0     |
+-------------+
| 2020-01-15  |
+-------------+

2)date_add, date_sub,datediff()日期的加减

-- 从今天开始,100天以后的日期
select date_add(current_date(), 100);

-- 从今天开始,100天以前的日期;
select date_sub(current_date(), 100);

-- 两个日期之间的差
select datediff(current_date(), "2019-01-03");
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
Hive 数据导入HBase的2种方法详解
最近经常被问到这个问题,所以简单写一下总结。Hive数据导入到HBase基本有2个方案:  1、HBase中建表,然后Hive中建一个外部表,这样当Hive中写入数据后,HBase中也会同时更新  2、MapReduce读取Hive数据,然后写入(API或者Bulkload)到HBase1、Hive外部表创
Stella981 Stella981
3年前
Dbeaver连接Hive和Mysql的配置
1.连接Hive首选需要配置Hive这里我们采用的是JDBC的连接方式(1)在Hive中后台启动hiveserver2root@hadoop101hivebin/hiveserver2&(2)启动beelinebigdata@hadoop101hive$bin/be
Wesley13 Wesley13
3年前
4cast
4castpackageloadcsv.KumarAwanish发布:2020122117:43:04.501348作者:KumarAwanish作者邮箱:awanish00@gmail.com首页:
Stella981 Stella981
3年前
Apache Hive File
!(https://oscimg.oschina.net/oscnet/fb84aa43cd6d4fe8b2e4e1ef6869584a.jpg)ApacheHiveTM(文件存储格式)Hive文件存储格式主要包括以下几类:1、TEXTFILE2、SEQUENCEFILE3
Stella981 Stella981
3年前
Hive基础学习
本节我们主要来学习一些hive的命令操作,同时探究一下Hive,HDFS,MySQL之间的联系,从而更好的理解其内部原理。常用的基础命令此处的命令都是指在hive命令行下执行的命令,所有的命令别忘记以分号结尾。hive show databases;查看当前数据库列表hive create databases dbna
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
Flink 系例 之 Process
process算子:处理每个keyBy(分区)输入到窗口的批量数据流(为KeyedStream类型数据流)示例环境java.version:1.8.xflink.version:1.11.1示例数据源(项目码云下载)Flink系例之搭建开发环境与数据(https://my.oschina.net/u/43