Hive利用宏自定义简短的函数

简介: Hive利用宏自定义简短的函数

背景

Hive SQL 代码的可读性一直是个问题哈,因为业务比较复杂,一般情况下写出来的代码也会很冗长,存在重复的逻辑,本篇通过一个工作过程中的示例来优化一下重复逻辑的问题,希望能够写出可读性更好的代码。

重复代码及问题

通过股票代码来判断所属市场,代码片段如下:

.....
 CASE 
  WHEN substr( a.symbol, 1, 3 ) = '000' THEN
  '深圳主板' 
  WHEN substr( a.symbol, 1, 3 ) = '001' THEN
  '深圳主板' 
  WHEN substr( a.symbol, 1, 3 ) = '002' THEN
  '中小企业板' 
  WHEN substr( a.symbol, 1, 3 ) = '003' THEN
  '中小企业板' 
  WHEN substr( a.symbol, 1, 3 ) = '004' THEN
  '中小企业板' 
  WHEN substr( a.symbol, 1, 3 ) = '688' THEN
  '科创板' 
  WHEN substr( a.symbol, 1, 2 ) = '30' THEN
  '创业板' 
  WHEN substr( a.symbol, 1, 2 ) = '60' THEN
  '上海主板' 
  WHEN substr( a.symbol, 1, 1 ) IN ( '4', '8' ) THEN
  '三板' 
 END AS mar_plate
.....

重复代码带来最大的问题就是可维护性,如果上面的代码在多个地方拷贝过,当逻辑需要修改时,要同时修改多处,如果有一处遗漏,就会出现 bug,排查起问题来是非常困难的,把自己坑死~

解决方案

自定义函数

重复的逻辑最先想到的是通过自定义函数来解决这个问题,此时就可以考虑使用用户自定义函数(UDF:user-defined function)

根据用户自定义函数类别分为以下三种:

  1. UDF(User-Defined-Function)一进一出
  2. UDAF(User-Defined Aggregation Function)聚集函数,多进一出,类似于:count/max/min
  3. UDTF(User-Defined Table-Generating Functions)一进多出,如 lateral view explore()

自定义函数编程步骤:

  • 第一步:创建 Maven Java 工程,导入 jar 包
  • 第二步:继承 org.apache.hadoop.hive.ql.UDF,并重载 evaluate 方法
  • 第三步:将项目打包,并上传到 Hive 的 lib 目录下
  • 第四步:添加上传后的 jar 包
  • 第五步:设置函数与自定义函数关联

但是像我们遇到的问题,并不是真正需要 UDF,而且 UDF 有更新维护也挺麻烦的,我们只是需要把一些繁琐、结构简单的逻辑封装起来以便重复在多个地方使用。

宏可以看做是一个简短的函数,或者是对一个表达式取别名,同时可以将这个表达式中的一些值作为变量调用时传入,比较适合于需要用到很多次的表达式操作进行封装,然后取个简短点的别名来调用,省去了定义函数的复杂步骤哈。

创建一个宏,通过股票代码来判断所属市场

DROP TEMPORARY MACRO
IF
 EXISTS getMarPlate;
CREATE TEMPORARY MACRO getMarPlate ( symbol string )
CASE
  WHEN substr( symbol, 1, 3 ) = '000' THEN
  '深圳主板' 
  WHEN substr( symbol, 1, 3 ) = '001' THEN
  '深圳主板' 
  WHEN substr( symbol, 1, 3 ) = '002' THEN
  '中小企业板' 
  WHEN substr( symbol, 1, 3 ) = '003' THEN
  '中小企业板' 
  WHEN substr( symbol, 1, 3 ) = '004' THEN
  '中小企业板' 
  WHEN substr( symbol, 1, 3 ) = '688' THEN
  '科创板' 
  WHEN substr( symbol, 1, 2 ) = '30' THEN
  '创业板' 
  WHEN substr( symbol, 1, 2 ) = '60' THEN
  '上海主板' 
  WHEN substr( symbol, 1, 1 ) IN ( '4', '8' ) THEN
  '三板' 
 END

前面的 SQL 就可以简化成下面的样子

......
getMarPlate(a.symbol) AS mar_plate
......

使用宏对这段逻辑进行提炼,起到优化开发效率、提升程序可读性的效果。

工作中常用的宏的场景:有关空值的处理,时间处理,数值计算,只要发现有类似的逻辑被反复调用,就可以考虑这种方式。

如果觉得还有帮助的话,你的关注和转发是对我最大的支持,O(∩_∩)O:

相关文章
|
8月前
|
SQL HIVE
Hive LAG函数分析
Hive LAG函数分析
91 0
|
8月前
|
SQL JSON Java
Hive【Hive(四)函数-单行函数】
Hive【Hive(四)函数-单行函数】
|
SQL 分布式计算 Java
Hive教程(07)- Hive自定义用户名密码验证(已开源)
Hive教程(07)- Hive自定义用户名密码验证(已开源)
372 0
|
3月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
59 4
|
3月前
|
SQL
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
48 2
|
8月前
|
SQL HIVE
hive高频函数(一)
hive高频函数(一)
60 0
|
4月前
|
SQL JavaScript 前端开发
Hive根据用户自定义函数、reflect函数和窗口分析函数
Hive根据用户自定义函数、reflect函数和窗口分析函数
48 6
|
8月前
|
SQL XML JSON
Hive函数全解——思维导图 + 七种函数类型
Hive函数全解——思维导图 + 七种函数类型
166 2
Hive函数全解——思维导图 + 七种函数类型
|
8月前
|
SQL 分布式计算 HIVE
Hive Cli / HiveServer2 中使用 dayofweek 函数引发的BUG!
在Hive 3.1.2和Spark 3.0.2集群环境中,遇到`dayofweek`函数bug。当`create_date`为字符串类型时,`dayofweek`函数结果错位。修复方法是将`create_date`转换为`date`类型。在Spark SQL中,原始代码能正常运行,未出现此问题。因此建议在Hive中使用转换后的日期类型以避免错误。
100 4
|
8月前
|
SQL HIVE
【Hive SQL】字符串操作函数你真的会用吗?
本文介绍了SQL中判断字符串是否包含子串的几种方法。`IN`函数判断元素是否完全等于给定元素组中的某项,而非包含关系。`INSTR`和`LOCATE`函数返回子串在字符串中首次出现的位置,用于检测是否存在子串。`SUBSTR`则用于提取字符串的子串。`LIKE`用于模糊匹配,常与通配符配合使用。注意`IN`并非用于判断子串包含。
562 3