1. 程式人生 > >hive函式篇一

hive函式篇一

hive 檢視函式:

show  functions;

desc functions 函式名

1. 時間函式

1.1 時間戳函式
--日期轉時間戳:從1970-01-01 00:00:00 UTC到指定時間的秒數
select unix_timestamp(); --獲得當前時區的UNIX時間戳
select unix_timestamp('2017-09-15 14:23:00'); 
select unix_timestamp('2017-09-15 14:23:00','yyyy-MM-dd HH:mm:ss');
select unix_timestamp('20170915 14:23:00','yyyyMMdd HH:mm:ss'); 

--時間戳轉日期
select from_unixtime(1505456567); 
select from_unixtime(1505456567,'yyyyMMdd'); 
select from_unixtime(1505456567,'yyyy-MM-dd HH:mm:ss'); 
select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss'); --獲取系統當前時間

1.2 獲取當前日期: current_date
hive> select current_date from dual
2017-09-15

1.3 日期時間轉日期:to_date(string timestamp) 
hive> select to_date('2017-09-15 11:12:00') from dual;
2017-09-15

1.4 獲取日期中的年/月/日/時/分/秒/周
with dtime as(select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss') as dt)
select year(dt),month(dt),day(dt),hour(dt),minute(dt),second(dt),weekofyear(dt)
  from dtime
  
1.5 計算兩個日期之間的天數: datediff
hive> select datediff('2017-09-15','2017-09-01') from dual;  
14

1.6 日期增加和減少: date_add/date_sub(string startdate,int days)
hive> select date_add('2017-09-15',1) from dual;    
2017-09-16
hive> select date_sub('2017-09-15',1) from dual;    
2017-09-14

--其他日期函式
查詢當前系統時間(包括毫秒數): current_timestamp;  
查詢當月第幾天: dayofmonth(current_date);
月末: last_day(current_date)
當月第1天: date_sub(current_date,dayofmonth(current_date)-1)
下個月第1天: add_months(date_sub(current_date,dayofmonth(current_date)-1),1)

2.字串函式

--正則表示式替換函式:regexp_replace
語法: regexp_replace(string A, string B, string C) 
返回值: string
說明:將字串A中的符合java正則表示式B的部分替換為C。注意,在有些情況下要使用轉義字元
舉例:
hive> select regexp_replace(‘foobar’, ‘oo|ar’, ”) from dual;
fb


正則表示式解析函式:regexp_extract
語法: regexp_extract(string subject, string pattern, int index) 
返回值: string
說明:將字串subject按照pattern正則表示式的規則拆分,返回index指定的字元。注意,在有些情況下要使用轉義字元
舉例:
hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 1) from dual;
the
hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) from dual;
bar
hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 0) from dual;
foothebar

0表示把整個正則表示式對應的結果全部返回

1表示返回正則表示式中第一個() 對應的結果 以此類推 


URL解析函式:parse_url
語法: parse_url(string urlString, string partToExtract [, string keyToExtract]) 
返回值: string
說明:返回URL中指定的部分。partToExtract的有效值為:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.

舉例:
* parse_url('http://facebook.com/path/p1.php?query=1', 'HOST')返回'facebook.com' 
* parse_url('http://facebook.com/path/p1.php?query=1', 'PATH')返回'/path/p1.php' 
* parse_url('http://facebook.com/path/p1.php?query=1', 'QUERY')返回'query=1',
可以指定key來返回特定引數,例如
* parse_url('http://facebook.com/path/p1.php?query=1', 'QUERY','query')返回'1',

* parse_url('http://facebook.com/path/p1.php?query=1#Ref', 'REF')返回'Ref' 
* parse_url('http://facebook.com/path/p1.php?query=1#Ref', 'PROTOCOL')返回'http'

 

json解析函式:get_json_object
語法: get_json_object(string json_string, string path) 
返回值: string

說明:解析json的字串json_string,返回path指定的內容。

第一個引數(string json_string)填寫json物件變數,第二個引數(string path)使用$表示json變數標識,然後用 . 或 [] 讀取物件或陣列;

如果輸入的json字串無效,那麼返回NULL。 
每次只能返回一個數據項。
舉例:

  1. data =
  2. {
  3. "store":
  4. {
  5. "fruit":[{"weight":8,"type":"apple"}, {"weight":9,"type":"pear"}],
  6. "bicycle":{"price":19.95,"color":"red"}
  7. },
  8. "email":"[email protected]_for_json_udf_test.net",
  9. "owner":"amy"
  10. }

get單層值

hive> select get_json_object(data, '$.owner') from test;
結果:amy
get多層值.

hive> select get_json_object(data, '$.store.bicycle.price') from test;
結果:19.95
get陣列值[]

hive> select get_json_object(data, '$.store.fruit[0]') from test;
結果:{"weight":8,"type":"apple"}

如request ={“store”: {“fruit”:[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],  “bicycle”:{“price”:19.95,”color”:”red”}  }

>get_json_object(request,'$.weight')

8

 

空格字串函式:space
語法: space(int n) 
返回值: string
說明:返回長度為n的字串
舉例:
hive> select space(10) from dual;
hive> select length(space(10)) from dual;
10


重複字串函式:repeat
語法: repeat(string str, int n) 
返回值: string
說明:返回重複n次後的str字串
舉例:
hive> select repeat(‘abc’,5) from dual;
abcabcabcabcabc


首字元ascii函式:ascii
語法: ascii(string str) 
返回值: int
說明:返回字串str第一個字元的ascii碼
舉例:
hive> select ascii(‘abcde’) from dual;
97


左補足函式:lpad
語法: lpad(string str, int len, string pad) 
返回值: string
說明:將str進行用pad進行左補足到len位
舉例:
hive> select lpad(‘abc’,10,’td’) from dual;
tdtdtdtabc
與GP,ORACLE不同,pad 不能預設


右補足函式:rpad
語法: rpad(string str, int len, string pad) 
返回值: string
說明:將str進行用pad進行右補足到len位
舉例:
hive> select rpad(‘abc’,10,’td’) from dual;
abctdtdtdt


分割字串函式: split
語法:  split(string str, string pat) 
返回值:  array
說明: 按照pat字串分割str,會返回分割後的字串陣列
舉例:
hive> select split(‘abtcdtef’,'t’) from dual;
["ab","cd","ef"]


集合查詢函式: find_in_set
語法: find_in_set(string str, string strList) 
返回值: int
說明: 返回str在strlist第一次出現的位置,strlist是用逗號分割的字串。如果沒有找該str字元,則返回0
舉例:
hive> select find_in_set(‘ab’,'ef,ab,de’) from dual;
2
hive> select find_in_set(‘at’,'ef,ab,de’) from dual;
0