hive 当年末 hive当前日期减一年_hive 当年末


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中常用的三个函数如下:

  1. 日期减n天
1 select date_sub(current_date,2)
2 select date_sub('2020-03-20',1)  --2020-03-19`


  1. 日期加n天
1 select date_add('2020-03-19',2)  --2020-03-21


  1. 日期差
1 select datediff('2020-03-22','2020-03-20') --2


2.正则表达式

Hive中正则表达函数有3个

  1. regexp(string,pattern) --返回值 布尔类型 true false
    主要在where中作筛选条件
1  select regexp('ab.ge','[0-9]') --false
2  --同时包含数字和字母的正则表达式:'^(?![0-9]+$)[0-9a-zA-z].*?$'


  1. 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)


  1. regexp_replace(string,pattern,replace string) --返回值 string

主要在select语句中作替换


1 select regexp_replace('adci892','[0-9]','v') --adcivvv


3.排序操作

  1. order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序),
    只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
  2. sort by不是全局排序,其在数据进入reducer前完成排序,
    sort by 的数据只能保证在同一reduce中的数据可以按指定字段排序。
  3. distribute by 按照指定的字段对数据进行划分到不同的输出reduce / 文件中
  4. cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。