hive利器 宏macro的详解

2023-12-11 10:48
文章标签 详解 hive 利器 macro

本文主要是介绍hive利器 宏macro的详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声明:本帖子不是贫僧原创,都是为了学习和了解宏,使用宏,同时也加入自己在应用中对某些知识点的理解,做个一个综合的。向几位大佬致敬。建议看原贴,链接在最下面。

1.macro初步了解
宏可以看做是一个简短的函数,或者是对一个表达式取别名,同时可以将这个表达式中的一些值做成变量调用时传入,比较适合于做分析时为一些临时需要用到很多次的表达式操作封装一下取个简短点的别名来调用。宏只在当前会话有效,当退出hive控制台再进入时上次创建的宏就丢失了,如果需要永久保留某个宏,可以将其加入到${HIVE_HOME}/.hiverc文件中。
2.macro使用场景
我们都知道Hive中有UDF(user defined function)——即用户自定义函数,但是由于UDF是Java编写的,代码中堆变量的内存回收完全不受开发者控制,而UDF程序又是嵌套在Hive SQL中执行的,对规模较大的表,就往往会出现由于UDF内存回收不及时造成的out-of-memory错误。因此,在生产环境中,UDF是严格受限的。那么,怎么办呢?
幸好,大多数情况下我们并不是真正需要(不得不用)UDF,大多数时候我们仅仅只是需要把一些虽然繁琐但其实结构简单的逻辑封装起来以便重复使用。
3macro的语法及基本创建实例
3.1 创建语法:
CREATE TEMPORARY MACRO macro_name([col_name col_type, …]) expression;
3.2 创建使用例子
例子一:
create temporary macro fixed_number() 24;
select fixed_number();
在这里插入图片描述
例子二:
create temporary macro a(x string) length(x)+2;
select a(“fo”);
在这里插入图片描述
例三:
create temporary macro b(x string,y string) x+y;
select b(‘1’,‘2’);
在这里插入图片描述
例四:判断NULL和空串
create temporary macro nn(x string) nvl(trim(x),’ ') = ’ ';
如果x为NULL或空串,则返回true。

例五:空串转NULL
create temporary macro empty2null (x string) if(trim(x) = ‘’, null, x);

3.4删除macro语法
DROP TEMPORARY MACRO [IF EXISTS] macro_name;
例子:
DROP TEMPORARY MACRO IF EXISTS a;
注:其实根据它只能在当前会话中使用,其实不删也行。但如果真必须用完立马删,也可以用此语法删掉。

4.建表 create table employee(id string,birthday string)
加入数据 insert into table employee values (‘1’,‘0202’)
5.测试
5.1单独的sql
SELECT
if(birthday is not null and length(birthday)=4,
case
when birthday >= ‘0321’ and birthday <= ‘0420’ then ‘白羊座’
when birthday >= ‘0421’ and birthday <= ‘0520’ then ‘金牛座’
when birthday >= ‘0521’ and birthday <= ‘0621’ then ‘双子座’
when birthday >= ‘0622’ and birthday <= ‘0722’ then ‘巨蟹座’
when birthday >= ‘0723’ and birthday <= ‘0822’ then ‘狮子座’
when birthday >= ‘0823’ and birthday <= ‘0922’ then ‘处女座’
when birthday >= ‘0923’ and birthday <= ‘1022’ then ‘天秤座’
when birthday >= ‘1023’ and birthday <= ‘1121’ then ‘天蝎座’
when birthday >= ‘1122’ and birthday <= ‘1221’ then ‘射手座’
when birthday >= ‘1222’ and birthday <= ‘1231’ then ‘摩羯座’
when birthday >= ‘0101’ and birthday <= ‘0119’ then ‘摩羯座’
when birthday >= ‘0120’ and birthday <= ‘0218’ then ‘水瓶座’
when birthday >= ‘0219’ and birthday <= ‘0320’ then ‘双鱼座’
else null
end, null) as zodiac
FROM
employee;
在这里插入图片描述
5.2 利用宏的方式
5.2.1 创建宏
DROP TEMPORARY MACRO IF EXISTS getZodiacFromBirth;
CREATE TEMPORARY MACRO getZodiacFromBirth(birthday string)
if(birthday is not null and length(birthday)=4,
case
when birthday >= ‘0321’ and birthday <= ‘0420’ then ‘白羊座’
when birthday >= ‘0421’ and birthday <= ‘0520’ then ‘金牛座’
when birthday >= ‘0521’ and birthday <= ‘0621’ then ‘双子座’
when birthday >= ‘0622’ and birthday <= ‘0722’ then ‘巨蟹座’
when birthday >= ‘0723’ and birthday <= ‘0822’ then ‘狮子座’
when birthday >= ‘0823’ and birthday <= ‘0922’ then ‘处女座’
when birthday >= ‘0923’ and birthday <= ‘1022’ then ‘天秤座’
when birthday >= ‘1023’ and birthday <= ‘1121’ then ‘天蝎座’
when birthday >= ‘1122’ and birthday <= ‘1221’ then ‘射手座’
when birthday >= ‘1222’ and birthday <= ‘1231’ then ‘摩羯座’
when birthday >= ‘0101’ and birthday <= ‘0119’ then ‘摩羯座’
when birthday >= ‘0120’ and birthday <= ‘0218’ then ‘水瓶座’
when birthday >= ‘0219’ and birthday <= ‘0320’ then ‘双鱼座’
else null
end, null);
5.2.2使用
select getZodiacFromBirth(birthday) from employee;
在这里插入图片描述
项目思考改进:宏的特性在生产上还真的可以替代诸多的udf。而且还不怕服务器重启,工作流的调度必须先跑udf脚本,udf函数管理的混乱等。但取代不了,很复杂的,sql搞不定的还是得用udf都得知道会,udf是通用型的。
其实大多数不需要循环结构的逻辑,基本上都可以用宏来处理。它不仅可以用来做字段值的转换映射,也可以做逻辑校验。比如:

–判断身份证号是否合法
DROP TEMPORARY MACRO IS_VALID_IDNO;
CREATE TEMPORARY MACRO IS_VALID_IDNO(idno string)
IF(idno rlike ‘1\d{5}(19|20)\d{2}(0[1-9]|1[0-2])([0-2]\d|3[0-1])\d{4} ′ O R i d n o r l i k e ′ [ 1 − 9 ] d 5 d 2 ( 0 [ 1 − 9 ] ∣ 1 [ 0 − 2 ] ) ( [ 0 − 2 ] d ∣ 3 [ 0 − 1 ] ) d 3 &#x27; OR idno rlike &#x27;^[1-9]\\d{5}\\d{2}(0[1-9]|1[0-2])([0-2]\\d|3[0-1])\\d{3} ORidnorlike[19]d5d2(0[19]1[02])([02]d3[01])d3’,true,false);

最后,说一下宏的局限性。宏只能是临时宏,只在本次会话中可见、有效。因此你需要将宏脚本放在SQL脚本的头部。

照搬:https://segmentfault.com/a/1190000009816609
照搬:https://www.cnblogs.com/cc11001100/p/10232531.html
照搬:https://blog.csdn.net/weixin_39454683/article/details/90485257


  1. 1-9 ↩︎

这篇关于hive利器 宏macro的详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/480424

相关文章

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.