对于从事数据开发的朋友来说,Hive内置函数无疑是日常数据清洗与转换工作中的“万能工具”。无论是字符串清理、数值运算,还是日期处理和集合操作,这些函数都能帮你大幅减少手动编写UDF的繁琐。今天,我们就按照实际项目中的使用频率,系统梳理几类核心函数,并分享它们在不同场景下的最佳实践。

字符串处理函数:最常用的“数据清洁工”
字符串处理几乎是每个ETL脚本中必不可少的一环。下面这几个函数建议牢牢记在脑海中——因为每天都会用到。
UPPER(string str)/LOWER(string str):大小写转换,是在执行模糊匹配前预处理的标准动作。TRIM(string str)/LTRIM(string str)/RTRIM(string str):清除字符串两端或单侧的空白字符。千万别小看这个功能,很多脏数据正是依靠它们恢复干净的。SUBSTR(string str, int start, int length):提取子字符串。当字段中隐藏着结构化信息(比如编码规则)时,这是解析利器。INSTR(string str, string pattern):查找模式首次出现的位置。常用于判断某字段是否包含特定关键词。REPLACE(string str, string pattern, string replacement):替换操作。在清洗特殊字符、统一格式时使用频率极高。
数值处理函数:不止四舍五入那么简单
数值场景经常涉及类型转换、舍入和数学运算。这里重点介绍几个容易在细节上出问题的用法。
CAST(value AS data_type):显式类型转换。要警惕隐式转换带来的精度损失,该手动指定时一定不要偷懒。ADD_MONTHS(date date, int months):日期添加月数(虽然归类在数值类,实际属于日期函数)。在计算账期、到期日时非常方便。DATEDIFF(date date1, date date2)/MONTHS_BETWEEN(date date1, date date2):日期差与时间差计算。注意DATEDIFF只返回天数,而MONTHS_BETWEEN返回带小数的月数。ROUND(double value, int scale)/CEIL(double value)/FLOOR(double value):四舍五入、向上取整、向下取整。在金额统计、数据分桶等操作中经常成对出现。EXP(double number)/LN(double number)/LOG10(double number):指数、自然对数、常用对数。一般在增长模型或特定分析场景中才会使用。RAND()/RAND(int seed):生成0~1之间的随机数。带种子值的版本可以保证结果可复现,在数据抽样或打散时非常实用。
日期时间处理函数:时间维度分析的基石
时间字段在业务分析中无处不在,Hive提供的这套函数几乎覆盖了所有常见需求。
CURRENT_DATE()/CURRENT_TIMESTAMP():获取系统当前日期/时间。注意不同Hive版本的行为略有差异,生产环境建议先测试验证。FROM_UNIXTIME(int timestamp)/TO_UNIXTIME(date date):时间戳与标准日期格式之间的互转。当数据源来自日志系统时,这两个函数堪称必杀技。DATE_ADD(date date, int interval)/DATE_SUB(date date, int interval):日期加减运算。简单直接,比手动计算安全得多。DAYOFWEEK(date date)(周日=1) /WEEK(date date)(周一=1):星期几的两种返回模式。注意不同业务对“第一天”的定义可能不同,使用前要确认清楚。DAYOFMONTH(date date)/DAYOFYEAR(date date)/WEEKOFYEAR(date date):获取日、年中的第几天、年中的第几周。YEAR(date date)/QUARTER(date date)/MONTH(date date):提取年份、季度、月份,是时间维度下钻的基础操作。
集合处理函数:搞定复杂聚合
如果只是简单的COUNT、SUM,用不上集合函数。但当你需要将一个分组内的多个值合并成列表或去重集合时,它们就派上大用场了。
COLLECT_LIST(expression):将所有值收集为一个列表。注意顺序不可靠,多次运行结果可能不同。COLLECT_SET(expression):收集唯一值集合(去重)。在计算每个分组内的独立元素数量时非常高效。SIZE(collection):返回集合的元素个数。经常与COLLECT_SET配合,统计每组有多少个不同的值。UNION_ALL(collection1, collection2, ...)/INTERSECT_ALL(collection1, collection2, ...)/EXCEPT_ALL(collection1, collection2, ...):并集、交集、差集。注意这些函数会保留重复元素(ALL后缀),如果需要去重可以使用UNION等变体——不过Hive目前对去重集合操作的支持有限,实际使用频率不高。
以上这些内置函数已经能够覆盖大部分数据转换场景。在实际项目中,经常需要组合使用:比如先做TRIM再执行LOWER,或者先CAST转换类型后再做ROUND运算。多尝试几次,你就能逐步建立起自己的函数工具箱。下次遇到数据清洗需求,先别急着编写UDF——翻翻内置函数库,说不定一行代码就能搞定。
