更新時(shí)間:2022-12-30 來(lái)源:黑馬程序員 瀏覽量:
內(nèi)置函數(shù)可分為:數(shù)值類(lèi)型函數(shù)、日期類(lèi)型函數(shù)、字符串類(lèi)型函數(shù)、集合函數(shù)、條件函數(shù)等;
用戶(hù)定義函數(shù)根據(jù)輸入輸出的行數(shù)可分為3類(lèi):UDF、UDAF、UDTF。
用戶(hù)定義函數(shù)UDF分類(lèi)標(biāo)準(zhǔn), 可以根據(jù)函數(shù)輸入輸出的行數(shù)劃分:
UDF(User-Defined-Function)普通函數(shù),一進(jìn)一出。
UDAF(User-Defined Aggregation Function)聚合函數(shù),多進(jìn)一出。
UDTF(User-Defined Table-Generating Functions)表生成函數(shù),一進(jìn)多出。
UDF分類(lèi)標(biāo)準(zhǔn)本來(lái)針對(duì)的是用戶(hù)自己編寫(xiě)開(kāi)發(fā)實(shí)現(xiàn)的函數(shù)。UDF分類(lèi)標(biāo)準(zhǔn)可以擴(kuò)大到Hive的所有函數(shù)中:包括內(nèi)置函數(shù)和用戶(hù)自定義函數(shù)。
因?yàn)椴还苁鞘裁搭?lèi)型的函數(shù),一定滿(mǎn)足于輸入輸出的要求,那么從輸入幾行和輸出幾行上來(lái)劃分沒(méi)有任何問(wèn)題。千萬(wàn)不要被UD(User-Defined)這兩個(gè)字母所迷惑,照成視野的狹隘。比如Hive官方文檔中,針對(duì)聚合函數(shù)的標(biāo)準(zhǔn)就是內(nèi)置的UDAF類(lèi)型。
內(nèi)置函數(shù)(build-in)指的是Hive開(kāi)發(fā)實(shí)現(xiàn)好,直接可以使用的函數(shù),也叫做內(nèi)建函數(shù)。內(nèi)置函數(shù)根據(jù)應(yīng)用歸類(lèi)整體可以分為8大種類(lèi)型,我們將列舉其中重要的,使用頻率高的函數(shù)的進(jìn)行詳細(xì)講解。
(1)String Functions 字符串函數(shù)
?字符串長(zhǎng)度函數(shù):length ?字符串反轉(zhuǎn)函數(shù):reverse ?字符串連接函數(shù):concat ?帶分隔符字符串連接函數(shù):concat_ws ?字符串截取函數(shù):substr,substring
------------String Functions 字符串函數(shù)------------ select length("itcast"); select reverse("itcast"); select concat("angela","baby"); --帶分隔符字符串連接函數(shù):concat_ws(separator, [string | array(string)]+) select concat_ws('.', 'www', array('itcast', 'cn')); --字符串截取函數(shù):substr(str, pos[, len]) 或者substring(str, pos[, len]) select substr("angelababy",-2); --pos是從1開(kāi)始的索引,如果為負(fù)數(shù)則倒著數(shù)select substr("angelababy",2,2); --分割字符串函數(shù): split(str, regex) select split('apache hive', ' ');
(2)Date Functions 日期函數(shù)
-----------Date Functions 日期函數(shù)----------------- --獲取當(dāng)前日期: current_date select current_date(); --獲取當(dāng)前UNIX時(shí)間戳函數(shù): unix_timestamp select unix_timestamp(); --日期轉(zhuǎn)UNIX時(shí)間戳函數(shù): unix_timestamp select unix_timestamp("2011-12-07 13:01:03"); --指定格式日期轉(zhuǎn)UNIX時(shí)間戳函數(shù): unix_timestamp select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss'); --UNIX時(shí)間戳轉(zhuǎn)日期函數(shù): from_unixtime select from_unixtime(1618238391); select from_unixtime(0, 'yyyy-MM-dd HH:mm:ss'); --日期比較函數(shù): datediff 日期格式要求'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'select datediff('2012-12-08','2012-05-09'); --日期增加函數(shù): date_add select date_add('2012-02-28',10); --日期減少函數(shù): date_sub select date_sub('2012-01-1',10);
----Mathematical Functions 數(shù)學(xué)函數(shù)------------- --取整函數(shù): round 返回double類(lèi)型的整數(shù)值部分(遵循四舍五入) select round(3.1415926); --指定精度取整函數(shù): round(double a, int d) 返回指定精度d的double類(lèi)型select round(3.1415926,4); --取隨機(jī)數(shù)函數(shù): rand 每次執(zhí)行都不一樣返回一個(gè)0到1范圍內(nèi)的隨機(jī)數(shù)select rand(); --指定種子取隨機(jī)數(shù)函數(shù): rand(int seed) 得到一個(gè)穩(wěn)定的隨機(jī)數(shù)序列 select rand(3);
(4)Conditional Functions 條件函數(shù)
主要用于條件判斷、邏輯判斷轉(zhuǎn)換這樣的場(chǎng)合
-----Conditional Functions 條件函數(shù)------------------ --使用之前課程創(chuàng)建好的student表數(shù)據(jù) select * from student limit 3; --if條件判斷: if(boolean testCondition, T valueTrue, T valueFalseOrNull) select if(1=2,100,200); select if(sex ='男','M','W') from student limit 3; --空值轉(zhuǎn)換函數(shù): nvl(T value, T default_value) select nvl("allen","itcast"); select nvl(null,"itcast"); --條件轉(zhuǎn)換函數(shù): CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end; select case sex when '男' then 'male' else 'female' end from student limit 3;