hive函式-數學函式 可在特徵工程中使用
hive中資料函式可以直接在提取特徵中使用,如 均值、方差、最大值、最小值、協方差等,重點關注以下的聚合函式內容。
一、hive函式之數學函式
round(double d)--返回double型d的近似值(四捨五入),返回bigint型;
round(double d,int n)--返回保留double型d的n位小數double型近似值(四捨五入);
floor(double d)--返回<=d的最大bigint值;
ceil(double d)--返回>=d的最小bigint 值;
ceiling(double d)--返回>=d的最小bigint 值;
rand() --每行返回一個double型隨機數;
rand(int seed) --每行返回一個double型隨機數,整數seed是隨機因子;
exp(double d)--返回e的 d冪次方,返回double型;
ln(double d)--以自然數為底d的對數,返回double型;
log10(double d)--以10為底d的對數,返回double型;
log2(double d)--以2為底d的對數,返回double型;
log(double base,double d)--以base為底d的對數,返回double型;
pow(double d,double p)--d的p次冪,返回double型;
power(double d,double p)--d的p次冪,返回double型;
sqrt(double d)--d的平方根,返回double型;
bin(bigint i)--二進位制i的string型別;
hex(bigint i)--十六進位制i的string型別;
hex(string str)--計算十六進位制表達的str值;
unhex(string i)--hex(string str)的逆方法;
conv(bigint num,int from_base,int to_base)--將bigint型別的num從from_base進位制轉換成to_base進位制,返回string型別;
conv(string num,int from_base,int to_base)--將string型別的num從from_base進位制轉換成to_base進位制,返回string型別;
abs(double d)--計算double型d 的絕對值,返回double型;
pmod(int i1,int i2)--int型i1對 int型 i2取模,結果為int型;
pmod(double d1,double d2)--double型i1對double型 i2取模,結果為double型;
sin(double d)--返回d的正弦值,結果為double型;
asin(double d)--返回d的反正弦值,結果為double型;
cos(double d)--返回d 的餘弦值,結果為double型;
acos(double d)--返回d的反餘弦值,結果為double型;
tan(double d)--返回d的正切值,結果為double型;
atan(double d)--返回d的反正切值,結果為double型;
degrees(double d)--將弧度值d轉換成角度值,結果為double型;
radians(double d)--將角度值d轉換成弧度值,結果為double型;
positive(int i)--等價有效表示式是\+i,返回i,結果為int型;
positive(double d)--等價有效表示式是\+d,返回d,結果為double型;
negative(int i)--等價有效表示式是-i,返回i的負數,結果為int型;
negative(double d)--等價有效表示式是-i,返回d的負數,結果為double型;
sign(double d)--如果d是正數的話,則返回float型1.0,如果d是負數的話,則返回-1.0,否則返回0.0;
e()--數學常熟e,超越數;
PI()--數學常數Pi,圓周率;
二、hive函式之聚合函式
count(*)--計算總行數,包括null值;
count(expr)--計算expr表示式的值,非null的行數;
count(distinct expr[,expr_.])--計算expr表示式的值排重後非null的行數;
sum(col)--指定行的值的和;
sum(distinct col)--排重後值的和;
avg(col)--指定行的值的平均值;
avg(distinct col)--排重後的值的平均值;
min(col)--指定行的值的最小值;
max(col)--指定行的值的最大值;
variance(col)--返回col 中一組數值的方差;
var_pop(col)---返回col 中一組數值的方差;
var_samp(col)--返回col 中一組數值的樣本方差;
stddev_pop(col)--返回col 中一組數值的標準偏差;
stddev_samp(col)--返回col 中一組數值的樣本偏差;
covar_pop(col1,col2)--返回一組數值的協方差;
covar_samp(col1,col2)--返回一組數值的樣本協方差;
corr(col1,col2)--返回兩組數值的相關係數;
percentile(bigint int_expr,p)--int_expr在p(範圍是[0,1])處對應的百分比,其中p是double型;
percentile(bigint int_expr,array(p1[,p2…]))--int_expr在p(範圍是[0,1])處對應的百分比,其中p是double型陣列;
percentile(double col,p[,NB])--col在p(範圍是[0,1])處對應的百分比,其中p是double型,NB是用於估計的直方圖中的倉庫數量(預設10000);
percentile_approx(double col,array(p1[,p2…])[,NB])--col在p(範圍是[0,1])處對應的百分比,其中p是double型陣列,NB是用於估計的直方圖中的倉庫數量(預設10000);
histogram_numeric(col,NB)--返回NB數量的直方圖倉庫陣列,返回結果array<struct{'x','y'}>中的值x是中心,y是倉庫的高;
collect_set(col)--返回集合col元素排重後的陣列;
set hive.map.aggr=true; --通過設定屬性hive.map.aggr值為true來提高聚合效能;
三、hive函式之表生成函式
當時用表生成函式時,hive要求使用別名;
explode(ARRAY array)--返回0到多行結果,每行都對應輸入的array陣列中的一個元素;
explode(MAP map)--返回0到多行結果,每行對應每個map鍵-值對,其中一個欄位是map鍵,另一個欄位是對應的map值;
explode(ARRAY<TYPE> a)--對於a的每個元素,explode()會生成一行記錄包含這個元素;
inline(ARRAY<STRUCT[,STRUCT]>)--將結構體陣列提取出來並插入到表中;
json_tuple(STRING jsonStr,p1p2,…,pn)--本函式可以接受多個標籤名稱,對於輸入的json字串進行處理,這個與get_json_object類似,不過更高效,通過一次呼叫就可以獲得多個鍵值;
parse_url_tuple(url,partname1,partname2,…,partnameN)--從url中解析出n部分資訊,其輸入引數是url,以及多個要抽取部分的名稱。所有輸入的引數型別都是string,部分名稱大小寫是敏感的,不應該包含空格:HOST,PATH,QUERY,REF,PROTOCOL,AUTHORITY,FILE,USERINFO,QUERY:<KEY_NAME>;
stact(int n,col1,col2,…,colM)--把M列換成N行,每行有M/N個欄位,n為常數;
四、hive函式之其他內建函式
ascii(string s)--返回字串s中首個ASCII字元的整數型;
base64(binary bin)--基於二進位制值bin轉換成基於64位的字串;
binary(srting s)--將輸入的值轉換成二進位制值;
binary(BINARY b)--將輸入的值轉換成二進位制值;
cast(<expr> as <type>)--將expr轉換成type型別的,例如cast('1' as bigint)會將字串轉換成bigint數值型別,如果轉換失敗,則返回null;
concat(binary s1,binary s2,…)--將二進位制位元組碼按次序拼接成一個字串;
concat(string s1,string s2,…)--將字串s1,s2等拼接成一個字串,例如concat('ab','cd')的結果是 'abcd';
concat_ws(string separator,string s1,string s2,…)--與concat類似,不過是使用指定的分隔符進行拼接的;
context_ngrams(array<array<string>>,array<string>,int K,int pf)--與ngrams類似,但是從每個外層陣列的第二個單詞陣列來查詢前K個字尾;
decode(binary bin,string charset)--使用指定的字符集charset將二進位制bin解碼成字串(支援的字符集有:'US_ASCII','IOS-8859-1','UTF-8','UTF-16BE','UTF-16FE','UTF-16'),如果任一項輸入引數為null,則結果為null;
encode(string src,string charset)--使用指定的字符集charset將字串src編碼成二進位制值(支援的字符集有:'US_ASCII','IOS-8859-1','UTF-8','UTF-16BE','UTF-16FE','UTF-16'),如果任一項輸入引數為null,則結果為null;
find_in_set(string s,string commaSeparatedString)--返回在以逗號分隔的字串中s出現的位置,如果沒找到則返回null;
format_number(number x,int d)--將數值x轉換成‘#,###,###.##’格式字串,並保留d位小數。如果d為0,那麼輸出值就沒有小數點後面的值;
get_json_object(string json_string,string path)--從給定路徑上的json字串中抽取json物件,並返回這個物件的json字串形式。如果輸入的json是非法的,則返回null;
in--例如test in(val1,val2,…),其表示如果test值等於後面列表中任一值的話,則返回true;
in_file(string s,string filename)--如果檔名為filename的檔案中有完整一行資料和字串s完全匹配的話,則返回true;
instr(string str,string substr)--查詢字串str中子字串substr第一次出現的位置;
length(string s)--計算字串s的長度;
locate(string substr,string str[,int pos])--查詢字串str中pos位置後字串substr第一次出現的位置;
lower(string s)--將字串中所有字母轉換成小寫字母;
lcase(string s)--和lower()一樣;
lpad(string s,int len,string pad)--從左邊開始對字串s使用字串pad進行填充,最終達到len長度為止。如果字串s本身長度比len大的話,那麼多餘部分會被去除;
ltrim(string s)--將字串s前面出現的空格全部去除掉;
ngram(array<array<string>>,int N,int K,int pf)--估計檔案中前K個字尾。pf是精度係數;
parse_url(string url,string partname[,string key])--從url中抽取指定部分的內容。引數url表示一個url字串,引數partname表示要抽取的部分名稱,其是大小寫敏感的,可選的值有:HOST,PATH,QUERY,REF,PROTOCOL,AUTHORITY,FILE,USERINFO,QUERY:<KEY>;如果partname是QUERY的話,那麼還需要指定第三個引數key;
printf(string format,Obj…args)--按照printf風格格式化輸出輸入的字串;
regexp_extract(string subject,string regexp_pattern,string index)--抽取字串subject中符合正則表示式regexp_pattern的第 index個部分的子字串;
regexp_relpace(string s,string regex,string replacement)--按照java正則表示式regex將字串s中符合條件的部分替換成replacement所指定的字串a,如果replacement部分是空的話,那麼符合正則的部分將會被去除掉。如regexp_relpace('hive','[ie]','z')的結果是'hzvz';
repeat(string s,int n)--重複輸入n次字串s;
reverse(string s)--反轉字串;
rpad(string s,int len,string pad)--從右面開始對字串s使用字串pad進行填充,最終達到len長度為止,如果字串s本身長度比len大的話,那麼多餘部分將會被去除;
rtrim(string s)--將字串s右面出現的空格全部去除掉;
sentences(string s,string lang,string locale)--將輸入字串s轉換成句子陣列,每個句子又由一個單詞陣列構成,單詞lang和locale是可選的,如果沒有使用,則使用預設本地化資訊;
size(MAP<K.V>)--返回map中元素的個數;
size(ARRAY<T>)--返回陣列array的元素個數;
space(int n)--返回n個空格;
split(string s,string pattern)--按照正則表示式pattern分割字串s,並將分割後的部分以字串陣列的方式返回;
str_to_map(string s,string delim1,string delim2)--將字串s按照指定分隔符轉化成map,第一個引數是輸入的字串,第二個引數是鍵值對之間的分隔符,第三個引數是鍵和值之間的分隔符;
substr(string s,string start_index,string length)--對於字串s,從start位置開始擷取length長度的字串,作為子字串,例如substr('abcdefgh',3,5)的結果是'cdefg';
substring(string s,string start_index,string length)--對於字串s,從start位置開始擷取length長度的字串,作為子字串,例如substr('abcdefgh',3,5)的結果是'cdefg';
substr(binary s,string start_index,string length)--對於二進位制位元組值s,從start位置開始擷取length長度的字串,作為子字串;
substring(binary s,string start_index,string length)--對於二進位制位元組值s,從start位置開始擷取length長度的字串,作為子字串;
trim(string a)--將字串a前後出現的空格全部去掉;
unbase64(string str)--將基於64位的字串str轉換成二進位制值;
upper(string a)--將字串中所有的字母轉換成大寫字母;
ucase(string a)--將字串中所有的字母轉換成大寫字母;
from_unixtime(bigint unixtime[,string format])--將時間戳秒數轉換成UTC時間,並用字串表示,可以通過format規定的時間格式,指定輸出的時間格式;
unix_timestamp()--獲取當前本地時區下的當前時間戳,例如:1534132825;
unix_timestamp(string date)--輸入的時間字串格式必須是yyyy-MM-dd HH:mm:ss,如果不符合則返回0,如果符合則將此時間字串轉換成Unix時間戳,例如unix_timestamp('2009-03-20 11:30:01')=1237519801;
unix_timestamp(string date,string pattern)--將指定時間字串格式轉換成Unix時間戳,如果格式不對,則返回0,例如unix_timestamp('2009-03-20','yyyy-MM-dd')=1237478400;
to_date(string timestamp)--返回時間字串的日期部分,例如:to_date("1970-01-01 00:00:00")="1970-01-01";
year(string date)--返回時間字串中的年份並使用int型別表示。例如:year("1970-01-01 00:00:00")="1970";
month(string date)--返回時間字串中的月份並使用int型別表示。例如:month("1970-01-01 00:00:00")="1";
day(string date)--返回時間字串中的天並使用int型別表示。例如:day("1970-01-01 00:00:00")="1";
dayofmonth(string date)--返回時間字串中的天並使用int型別表示。例如:day("1970-01-01 00:00:00")="1";
hour(string date)--返回時間字串中的小時並使用int型別表示。例如:hour("1970-01-01 11:58:59")="11";
minute(string date)--返回時間字串中的分鐘數;
second(string date)--返回時間字串中的秒數;
weekofyear(string date)--返回時間字串位於一年中第幾個周內,例如:weekofyear("1970-11-01 11:58:59")="44";
datediff(string enddate,string startdate)--計算開始時間startdate到結束時間enddate相差的天數,例如 datediff('2009-03-01','2009-02-27')=2;
date_add(string startdate,int days)--為開始時間startdate增加days天。例如:date_add('2018-12-31',1)='2009-01-01';
date_sub(string startdate,int days)--從開始時間startdate減去days天。例如date_sub('2008-12-31',1)='2018-12-30';
from_utc_timestamp(TIMESTAMP timestamp,STRING timezone)--如果給定的時間戳並非UTC,則將其轉化成指定的時區下的時間戳;
to_utc_timestamp(TIMESTAMP timestamp,STRING timezone)--如果給定的時間戳是指定的時區下的時間戳,則將其轉化成UTC下的時間戳;