1.日期函数
2.正则表达式
3.排序操作
本文主要分享下Hive中日期函数,正则表达式函数,以及排序函数的使用方法和特点。
1.日期函数
Hive中日期函数功能不是很强大,其实是加减函数只能对天操作,无法直接取n个月前的日期,或n年前的日期。即不支持add_months()
函数 和 interval
关键词。
1 /* 往前推两个月 */
2 select cast(add_months(date'2020-03-31',-2) as date format 'yyyy-dd-mm') --2020-01-31
3 /* 往前推1年*/
4 select cast(date'2020-04-01' - interval 1 years) --2019-04-01
5 --ps:上述语法为TD数据库,而且注意一点是interval关键词遇到闰年会报错
6 select cast(date'2020-02-29' - interval 1 years) --结果不会是2019-02-28 而是error
7 --推荐使用add_months()
8 select cast(add_months(date'2020-02-29',-12) as date format 'yyyy-dd-mm') --2020-02-28
Hive中常用的三个函数如下:
- 日期减n天
1 select date_sub(current_date,2)
2 select date_sub('2020-03-20',1) --2020-03-19`
- 日期加n天
1 select date_add('2020-03-19',2) --2020-03-21
- 日期差
1 select datediff('2020-03-22','2020-03-20') --2
2.正则表达式
Hive中正则表达函数有3个
- regexp(string,pattern) --返回值 布尔类型 true false
主要在where中作筛选条件
1 select regexp('ab.ge','[0-9]') --false
2 --同时包含数字和字母的正则表达式:'^(?![0-9]+$)[0-9a-zA-z].*?$'
- regexp_extract(string,pattern,int index) --返回值 string
int index 取值为[0-n],n不大于正则项pattern的组成个数,正则项由多部分组合每部分在()内包含。
1 select regexp_extract('6a9d0b','[0-9a-zA-Z]+',0)
2-- 返回 6a9d0b
index 必须且只能设定为0 默认是1 会报错 ,因为正则项pattern是一个整体,不是几个部分组成;正则项: '([0-9]+)(.*?)([0-9]+)'
这个正则项就是三部分组成 第一部分是数字([0-9]+) 第二部分是字符的贪婪匹配,第三部分是字母。
1 --取满足正则项的整体字符串
2 select regexp_extract('["84745554","asDd"]', '([0-9]+)(.*?)([a-zA-Z]+)',0);
3 --84745554","asDd
4 --取满足正则项的第一部分子字符串
5 select regexp_extract('["84745554","asDd"]', '([0-9]+)(.*?)([a-zA-Z]+)',1);--
6 --84745554
7 --取满足正则项的第二部分子字符串
8 select regexp_extract('["84745554","asDd"]', '([0-9]+)(.*?)([a-zA-Z]+)',2);
9 --","
10 --取满足正则项的第三部分子字符串
11 select regexp_extract('["84745554","asDd"]', '([0-9]+)(.*?)([a-zA-Z]+)',3);
12 --asDd
主要在select语句中筛选子字符串
1 select regexp_extrct('trx_txt','[0-9]',1)
- regexp_replace(string,pattern,replace string) --返回值 string
主要在select语句中作替换
1 select regexp_replace('adci892','[0-9]','v') --adcivvv
3.排序操作
-
order by
会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序),
只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。 -
sort by
不是全局排序,其在数据进入reducer前完成排序,
sort by 的数据只能保证在同一reduce中的数据可以按指定字段排序。 -
distribute by
按照指定的字段对数据进行划分到不同的输出reduce / 文件中 -
cluster by
除了具有 distribute by 的功能外还兼具 sort by 的功能。