[大数据]Hive(4)

7 函数

7.1 系统内置函数

-- 查看系统自带的函数
hive> show functions;
-- 显示自带的函数的用法
hive> desc function upper;
-- 详细显示自带的函数的用法
hive> desc function extended upper;

7.2 其他常用查询函数

7.2.1 空字段赋值

函数说明
NVL:给值为NULL的数据赋值,它的格式是NVL( string1, replace_with)。它的功能是如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。

select * from emp

在这里插入图片描述

select comm, nvl(comm, -1) from emp;

在这里插入图片描述

7.2.2 CASE WHEN

数据准备
emp_sex.txt:

悟空	A	男
大海	A	男
宋宋	B	男
凤姐	A	女
婷姐	B	女
婷婷	B	女
--建表
create table emp_sex(
name string, 
dept_id string, 
sex string) 
row format delimited fields terminated by "\t";
load data local inpath '/opt/module/datas/emp_sex.txt' into table emp_sex

在这里插入图片描述

-- 按需求查询数据
-- 统计不同部门男女各有多少人
select 
	dept_id,
	sum(case sex when '男' then 1 else 0 end) male_count,
	sum(case sex when '女' then 1 else 0 end) female_count
from
	emp_sex 
group by
	dept_id;

在这里插入图片描述

7.2.3 行转列

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

eg:需求,把星座和血型一样的人归类到一起

创建constellation.txt,导入数据

孙悟空	白羊座	A
大海	     射手座	A
宋宋	     白羊座	B
猪八戒    白羊座	A
凤姐	     射手座	A
select * from person_info;

在这里插入图片描述

-- 统计相同星座与血型共有多少人
select
	constellation,
	blood_type,
	count(*)
from
	person_info 
group by
	constellation,
	blood_type;

在这里插入图片描述
collect_list函数

-- 把同一组的人读成一个列表
select
	concat(constellation,",",blood_type) xzxx,
	collect_list(name)
from
	person_info 
group by 
	constellation, blood_type;

在这里插入图片描述
contact_ws:将列表里的函数拼接起来

select
	concat(constellation,",",blood_type) xzxx,
	concat_ws("|",collect_list(name))
from
	person_info 
group by 
	constellation, blood_type;

在这里插入图片描述

7.2.4 列转行

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

数据准备

movie	category
《疑犯追踪》	悬疑,动作,科幻,剧情
《Lie to me》	悬疑,警匪,动作,心理,剧情
《战狼2》	战争,动作,灾难

需求:
将电影中的数组数据展开,结果如下:

《疑犯追踪》      悬疑
《疑犯追踪》      动作
《疑犯追踪》      科幻
《疑犯追踪》      剧情
《Lie to me》   悬疑
《Lie to me》   警匪
《Lie to me》   动作
《Lie to me》   心理
《Lie to me》   剧情
《战狼2》        战争
《战狼2》        动作
《战狼2》        灾难

创建Hive表格并导入数据

create table movie_info(
    movie string, 
    category string) 
row format delimited fields terminated by "\t";
load data local inpath "/opt/module/datas/movie.txt" into table movie_info;
select * from movie_info

在这里插入图片描述

7.2.5 窗口函数

函数说明
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类型。

数据准备:
business.txt:name,order,cost

jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94

需求
(1)查询在2017年4月份购买过的顾客及总人数
(2)查询顾客的购买明细及月购买总额
(3)上述的场景, 将每个顾客的cost按照日期进行累加
(4)查询每个顾客上次的购买时间
(5)查询前20%时间的订单信息

创建表导入数据

create table business(name string, orderdata string, cost int)
row format delimited fields terminated by ',';
load data local inpath "/opt/module/datas/business.txt" into table business;
select * from business;

在这里插入图片描述
按需求查询数据

1.查询2017年4月否购买过东西的顾客

select distinct name
from business
where substring(orderdata, 1, 7) = "2017-04";

在这里插入图片描述

select name, count(*) over()
from business 
where substring(orderdata, 1, 7) = "2017-04"
group by name;

在这里插入图片描述
2.查询顾客的购买明细以及月购买总额

select 
	name, cost, orderdata, 
	sum(cost) over(partition by substring(orderdata, 1, 7))
from business;

按照月份进行加和
在这里插入图片描述
3.上述的场景, 将每个顾客的cost按照日期进行累加

select name,orderdate,cost, 
sum(cost) over() as sample1,--所有行相加 
sum(cost) over(partition by name) as sample2,--按name分组,组内数据相加 
sum(cost) over(partition by name order by orderdate) as sample3,--按name分组,组内数据累加 
sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4 ,--和sample3一样,由起点到当前行的聚合 
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --当前行和前面一行做聚合 
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--当前行和前边一行及后面一行 
sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --当前行及后面所有行 
from business;

在这里插入图片描述
查询每个月来的顾客以及明细

select name,orderdata,cost, 
concat_ws(",",collect_set(name)
over(partition by substring (orderdata, 1, 7)))
from business;

在这里插入图片描述
在这里插入图片描述
查询每个顾客上次(下次)的购买时间

--lag lead
select 
	name, orderdata, cost,
	lag(orderdata, 1 ,"1970-01-01") 
	over(partition by name order by orderdata) last_order,
	lead(orderdata, 1 ,"1970-01-01") 
	over(partition by name order by orderdata) next_order 
from business ;

在这里插入图片描述
查询前20%时间的订单信息

-- ntail
select * from (
    select name,orderdate,cost, ntile(5) over(order by orderdate) sorted
    from business
	) t
where sorted = 1;

在这里插入图片描述
百分比

-- percent_rank
select
	name, orderdata, cost,
	percent_rank() over(order by orderdata) pr
from
	business;

在这里插入图片描述

7.2.6 排序

函数说明
RANK() 排序相同时会重复,总数不会变
DENSE_RANK() 排序相同时会重复,总数会减少
ROW_NUMBER() 会根据顺序计算

新建文件 score.txt

孙悟空  语文    87
孙悟空  数学    95
孙悟空  英语    68
大海    语文    94
大海    数学    56
大海    英语    84
宋宋    语文    64
宋宋    数学    86
宋宋    英语    84
婷婷    语文    65
婷婷    数学    85
婷婷    英语    78

需求:
计算每门学科成绩排名。

--创建表并导入数据
create table score(
	name string,
	subject string, 
	score int) 
row format delimited fields terminated by "\t";

load data local inpath '/opt/module/datas/score.txt' into table score;

按需求查询数据

-- rank() dense_rank() row_number()
select name,subject,score,
rank() over(partition by subject order by score desc) rp,
dense_rank() over(partition by subject order by score desc) drp,
row_number() over(partition by subject order by score desc) rmp
from score;

在这里插入图片描述

7.2.7 日期相关函数

1.当前日期

select current_date();

2.日期加减

--今天开始90天以后的日期
select date_add(current_date(), 90);
--今天开始90天以前的日期
select date_sub(current_date(), 90);

3.两个日期之间的日期差

--今天和1990年1月1日的天数差
select datediff(current_date(), "1990-01-01");
--有哪些顾客连续两天有消费
--先排号
--求日期相减
--求连续两天来过的

select 
	name,temp,
	count(*) c
from
	(select
	*,
	date_sub(orderdata, rn) temp
	from 
		(select
		*,
		row_number() over(partition by name order by orderdata) rn
		from business) t1) t2
group by
	name,temp
having c>=2;

7.3 自定义UDF函数

1)创建一个Maven工程Hive
2)导入依赖

<dependencies>
		<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
		<dependency>
			<groupId>org.apache.hive</groupId>
			<artifactId>hive-exec</artifactId>
			<version>3.1.2</version>
		</dependency>
</dependencies>

3)创建类
(老接口)

package com.atguigu.hive;
import org.apache.hadoop.hive.ql.exec.UDF;

/**
 * 老接口,给一个字符串,返回长度
 */
public class MyUDF extends UDF {
    public int evaluate(String input) {
        if (input == null) return 0;
        return input.length();
    }
}

(新接口)实现类型检查器

package com.atguigu.hive;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

/**
 * 给一个字符串,返回长度
 */
public class MyUDF extends GenericUDF {
    /**
     * 对输入的方法做检查,以及约束输出的类型
     *
     * @param objectInspectors 输入参数的检查器
     * @return 输出参数的检查器
     * @throws UDFArgumentException
     */
    @Override
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        if (objectInspectors.length != 1) {
            throw new UDFArgumentLengthException("Wrong arguments count");
        }
        if (!objectInspectors[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)) {
            throw new UDFArgumentTypeException(0, "Wrong argument type");
        }
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
    }

    /**
     * 实现逻辑
     *
     * @param deferredObjects
     * @return
     * @throws HiveException
     */
    @Override
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        Object o = deferredObjects[0].get();
        if (o == null) return 0;
        return o.toString().length();
    }

    /**
     * 函数执行出错 错误提示
     * @param strings
     * @return
     */
    @Override
    public String getDisplayString(String[] strings) {
        return null;
    }
}

4)jar包上传到服务器/opt/module/hive/lib
5)jar包添加到hive的classpath

add jar /opt/module/hive/lib/hiveplugin20210506-1.0

6)创建临时函数与开发好的java class关联

create temporary function my_len as "com.atguigu.hive.MyUDF"

7)测试使用函数

select name, my_len(name) from business;

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 大数据Hive离线计算开发实战教案主要包括以下几个方面的内容: 1. 前期数据准备和环境搭建:介绍如何准备数据集、搭建Hadoop分布式环境以及安装和配置Hive。 2. Hive表的创建与管理:讲解如何通过Hive创建和管理表,包括表的分区、桶和索引等操作。同时介绍如何通过HiveQL语言对数据进行增删改查。 3. 数据清洗与转换:介绍如何使用Hive进行数据清洗和转换,包括数据去重、空值处理、数据格式转换等操作。同时还可以引导学员使用Hive内置函数和自定义函数对数据进行进一步处理和分析。 4. 数据抽取与加载:介绍如何使用Hive进行数据的抽取和加载,包括从其他数据库、Hadoop集群和外部文件系统中导入数据,以及将Hive查询结果导出到其他存储系统。 5. 数据统计与分析:介绍如何使用Hive进行数据统计和分析,包括使用聚合函数、窗口函数和分组操作进行数据分析,以及使用HiveQL编写复杂的数据查询和报表生成。 6. 性能优化与调优:介绍如何通过优化Hive表的设计、调整配置参数、使用分区和桶以及进行数据压缩等手段来提高Hive查询的性能。 7. 实际案例实战:提供一些实际的大数据案例,并引导学员使用Hive进行数据处理和分析。通过实际的案例演练,让学员更好地理解和掌握Hive离线计算的应用。 这些内容将通过理论讲解、实验操作和案例实战相结合的方式进行教学,帮助学员全面了解和掌握Hive离线计算的开发实战技巧,提升其在大数据领域的能力水平。 ### 回答2: 大数据Hive离线计算开发实战教案主要包括以下内容。 首先,教案将介绍Hive的基本概念和原理,包括Hive的架构、数据模型以及HiveQL查询语言的基本语法。 其次,教案将详细讲解Hive的数据导入与导出,包括如何使用Hive将数据从Hadoop集群导入到Hive表中,以及如何将Hive表中的数据导出到其他存储系统。 接着,教案将介绍Hive的表管理和分区设计,包括如何创建Hive表、修改表结构和删除表,以及如何对Hive表进行分区设计来优化查询性能。 此外,教案还将探讨Hive的性能调优和优化技术,如何通过调整Hive的配置参数、使用Hive的索引和分桶等方法来提高查询效率。 最后,教案将提供实际的案例和练习,来帮助学员理解和应用所学的知识。通过实际操作,学员将学会使用Hive进行离线计算开发,包括数据导入导出、表管理、分区设计以及性能调优等方面的技能。 综上所述,大数据Hive离线计算开发实战教案将通过理论讲解、实际操作和案例练习等方式,帮助学员掌握Hive的基本原理和技术,并能够应用Hive进行离线计算开发。通过学习这个教案,学员将能够熟练使用Hive进行数据处理和分析,并能够优化Hive查询性能以提高工作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值