Hive中常被忽视的利器——宏

我们都知道Hive中有UDF(user defined function)——即用户自定义函数,但是由于UDF是Java编写的,代码中堆变量的内存回收完全不受开发者控制,而UDF程序又是嵌套在Hive SQL中执行的,对规模较大的表,就往往会出现由于UDF内存回收不及时造成的out-of-memory错误。因此,在生产环境中,UDF是严格受限的。那么,怎么办呢?

幸好,大多数情况下我们并不是真正需要(不得不用)UDF,大多数时候我们仅仅只是需要把一些虽然繁琐但其实结构简单的逻辑封装起来以便重复使用。举个栗子:

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;

这么长一大段其实只是完成了一个很简单的逻辑——把生日转换成星座,如果这个逻辑需要在多个地方重复使用,那代码就会变得非常难看,几乎没法维护。这时往往我们就想到要去定义一个UDF,但其实没必要,杀鸡焉用牛刀。现在轮到本文的主角隆重出场了。我们可以创建一个宏:
--根据生日推算星座

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);

然后,我们前面这个SQL就可以简化成下面这个版本了。

select getZodiacFromBirth(birthday) from employee;

是不是很清爽呢?其实大多数不需要循环结构的逻辑,基本上都可以用宏来处理。它不仅可以用来做字段值的转换映射,也可以做逻辑校验。比如:

--判断身份证号是否合法

DROP TEMPORARY MACRO IS_VALID_IDNO;
CREATE TEMPORARY MACRO IS_VALID_IDNO(idno string)
IF(idno rlike '^[1-9]\\d{5}(19|20)\\d{2}(0[1-9]|1[0-2])([0-2]\\d|3[0-1])\\d{4}$'
    OR
    idno rlike '^[1-9]\\d{5}\\d{2}(0[1-9]|1[0-2])([0-2]\\d|3[0-1])\\d{3}$',true,false);

聪明如你,现在应该已经可以举一反三的运用宏这柄利器了,打字很累,我也就不再举例了。
最后,说一下宏的局限性。宏只能是临时宏,只在本次会话中可见、有效。因此你需要将宏脚本放在SQL脚本的头部。

repost:https://segmentfault.com/a/1190000009816609

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hive是一个大数据分析的开源平台,它提供了很多的综合应用案例,其中之一是用户学历查询。用户学历查询案例中,我们可以使用Hive从数据仓库中读取关于用户的数据,然后通过分析和聚合这些数据,来确定用户的学历信息。在这个过程中,Hive提供了强大的SQL语句支持,以及丰富的函数库,可以满足各种复杂的分析需求。 ### 回答2: 近日,一家大型人力资源公司因为工作中频繁查询员工学历信息而决定使用hive技术来进行数据的处理和分析,通过hive的综合应用,实现了更加高效便捷的用户学历查询。 此次项目中,该公司首先进行了数据清洗和处理,将员工学历相关信息从不同的数据源中收集并整合,统一存储在hive的数据仓库中。接着,通过hiveQL语言对数据进行查询和筛选,实现了仅需几秒钟即可得到用户学历信息的目标。使用hive的好处是能够快速处理海量数据,提高查询效率,同时还能实现数据分析和统计,并可视化展示数据结果。 在具体的操作中,该公司将原始数据进行拆分和转换,把不同的表进行组合和分析。同时,在处理数据过程中还运用了一些hadoop生态体系的其他组件,比如pig和spark等工具,以提高效率和处理这些数据所需的时间。在处理完成之后,用户可以通过hive对用户的学历进行查询,根据自己的需要,可以根据职位、学历、工作年限等限定条件来查询,大大地提高了查询精度,也让招聘和人事等相关部门的工作变得更加轻松便捷。 总的来说,该项目成功运用了hive技术,实现了用户学历查询的目标,提升了工作效率和数据查询的准确度。而且此次项目的经验和教训也可以为其他公司和企业在hive技术的运用方面提供借鉴和参考。 ### 回答3: Hive是Hadoop生态系统中的一项重要技术,它是基于Hadoop的MapReduce框架的数据仓库解决方案,可以进行大规模数据的存储和处理。而学历查询是一个典型的数据查询场景,由于学历查询需要对大量的数据进行快速高效的查询和分析,因此使用Hive进行学历查询可以大大提高查询效率和数据处理能力。 以学历查询为例,如果我们需要查询某个区域内所有人的学历情况,我们需要从海量的数据中筛选出相关的信息,然后进行分析和统计,这个过程需要耗费大量的时间和精力。但是如果使用Hive,我们可以通过Hive的SQL查询语句来快速实现数据查询和分析。 具体来说,如果我们要查询一个城市的所有居民的学历情况,首先要准备好相应的数据表或数据集,然后利用Hive的相关命令将数据导入到Hive表中。在数据导入完成后,我们可以使用类似于SQL的语句来实现查询。例如,我们可以使用Hive的SELECT语句和GROUP BY语句来实现按学历等级进行分组并统计各组的人数。 当然,如果需要更加复杂的查询和分析任务,我们也可以使用Hive进行更多的数据处理和计算任务。例如,Hive支持使用自定义的UDF函数,可以对数据实现更加灵活和精细化的处理。 总而言之,Hive作为一种分布式数据存储和查询解决方案,可以为学历查询等数据处理场景提供快速、高效和可扩展的解决方案。通过合理的数据分析和查询,可以帮助我们更好地了解数据背后的真相,为业务决策提供更多有效的参考和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值