hive函數參考手冊

原文見:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

1.內置運算符
1.1關係運算符(黑體 可補充研究)

運算符 類型 說明
A = B 所有原始類型 如果A與B相等,返回TRUE,否則返回FALSE
A == B 失敗,因爲無效的語法。 SQL使用”=”,不使用”==”。
A <> B 所有原始類型 如果A不等於B返回TRUE,否則返回FALSE。如果A或B值爲”NULL”,結果返回”NULL”。
A < B 所有原始類型 如果A小於B返回TRUE,否則返回FALSE。如果A或B值爲”NULL”,結果返回”NULL”。
A <= B 所有原始類型 如果A小於等於B返回TRUE,否則返回FALSE。如果A或B值爲”NULL”,結果返回”NULL”。
A > B 所有原始類型 如果A大於B返回TRUE,否則返回FALSE。如果A或B值爲”NULL”,結果返回”NULL”。
A >= B 所有原始類型 如果A大於等於B返回TRUE,否則返回FALSE。如果A或B值爲”NULL”,結果返回”NULL”。
A IS NULL 所有類型 如果A值爲”NULL”,返回TRUE,否則返回FALSE
A IS NOT NULL 所有類型 如果A值不爲”NULL”,返回TRUE,否則返回FALSE
A LIKE B 字符串 如果A或B值爲”NULL”,結果返回”NULL”。字符串A與B通過sql進行匹配,如果相符返回TRUE,不符返回FALSE。B字符串中 的”_”代表任一字符,”%”則代表多個任意字符。例如: (‘foobar’ like ‘foo’)返回FALSE,( ‘foobar’ like ‘foo_ _ _’或者 ‘foobar’ like ‘foo%’)則返回TURE
A RLIKE B 字符串 如果A或B值爲”NULL”,結果返回”NULL”。字符串A與B通過java進行匹配,如果相符返回TRUE,不符返回FALSE。例如:( ‘foobar’ rlike ‘foo’)返回FALSE,(’foobar’ rlike ‘^f.*r$’ )返回TRUE。
A REGEXP B 字符串 與RLIKE相同。

1.2算術運算符(斜體 比較二進制的值得結果)

運算符 類型 說明
A + B 所有數字類型 A和B相加。結果的與操作數值有共同類型。例如每一個整數是一個浮點數,浮點數包含整數。所以,一個浮點數和一個整數相加結果也是一個浮點數。
A – B 所有數字類型 A和B相減。結果的與操作數值有共同類型。
A * B 所有數字類型 A和B相乘,結果的與操作數值有共同類型。需要說明的是,如果乘法造成溢出,將選擇更高的類型。
A / B 所有數字類型 A和B相除,結果是一個double(雙精度)類型的結果。
A % B 所有數字類型 A除以B餘數與操作數值有共同類型。
A & B 所有數字類型 運算符查看兩個參數的二進制表示法的值,並執行按位”與”操作。兩個表達式的一位均爲1時,則結果的該位爲 1。否則,結果的該位爲 0。
A|B 所有數字類型  運算符查看兩個參數的二進制表示法的值,並執行按位”或”操作。只要任一表達式的一位爲 1,則結果的該位爲 1。否則,結果的該位爲 0。 
A ^ B 所有數字類型 運算符查看兩個參數的二進制表示法的值,並執行按位”異或”操作。當且僅當只有一個表達式的某位上爲 1 時,結果的該位才爲 1。否則結果的該位爲 0。
~A 所有數字類型 對一個表達式執行按位”非”(取反)。

1.3邏輯運算符

運算符 類型 說明
A AND B 布爾值 A和B同時正確時,返回TRUE,否則FALSE。如果A或B值爲NULL,返回NULL。
A && B 布爾值 與”A AND B”相同
A OR B 布爾值 A或B正確,或兩者同時正確返返回TRUE,否則FALSE。如果A和B值同時爲NULL,返回NULL。
A | B 布爾值 與”A OR B”相同
NOT A 布爾值 如果A爲NULL或錯誤的時候返回TURE,否則返回FALSE。
! A 布爾值 與”NOT A”相同

1.4複雜類型函數

函數 類型 說明
map (key1, value1, key2, value2, …)

通過指定的鍵/值對,創建一個map。

hive> Create table lxw_test as select map('100','tom','200','mary')as t from lxw_dual;

hive> describe lxw_test;

t       map<string,string>

hive> select t from lxw_test;

{"100":"tom","200":"mary"}

struct (val1, val2, val3, …)

通過指定的字段值,創建一個結構。結構字段名稱將爲COL1,COL2,…根據輸入的參數構建結構體struct類型

hive> create table lxw_test as select struct('tom','mary','tim')as t from lxw_dual;

hive> describe lxw_test;

t       struct<col1:string,col2:string,col3:string>

hive> select t from lxw_test;

{"col1":"tom","col2":"mary","col3":"tim"}

array (val1, val2, …) 通過指定的元素,創建一個數組。

hive> create table lxw_test as select array("tom","mary","tim") as t from lxw_dual;

hive> describe lxw_test;

t       array<string>

hive> select t from lxw_test;

["tom","mary","tim"]

1.5對複雜類型函數操作

函數 類型 說明
A[n] A是一個數組,n爲int型 返回數組A的第n個元素,第一個元素的索引爲0(數組的起始下標爲0)。如果A數組爲['foo','bar'],則A[0]返回’foo’和A[1]返回”bar”。
M[key] M是Map<K, V>,關鍵K型

返回關鍵值對應的值,例如mapM爲 \{‘f’ -> ‘foo’, ‘b’ -> ‘bar’, ‘all’ -> ‘foobar’\},則M['all'] 返回’foobar’。

hive> Create table lxw_test as selectmap('100','tom','200','mary') as t from lxw_dual;

hive> select t['200'],t['100'] from lxw_test;

mary    tom

S.x S爲struct 返回結構x字符串在結構S中的存儲位置。如 foobar \{int foo, int bar\} foobar.foo的領域中存儲的整數。

hive> create table lxw_test as select struct('tom','mary','tim')as t from lxw_dual;

hive> describe lxw_test;

t       struct<col1:string,col2:string,col3:string>

hive> select t.col1,t.col3 from lxw_test;

tom     tim

hive的內嵌函數

hive函數——>聚合函數、內置函數、表生成函數

內置函數——>數學函數、字符函數、收集函數、轉換函數、日期函數、條件函數

2.內置函數

2.1數學函數

返回類型 函數 說明
BIGINT round(double a) 四捨五入取整
DOUBLE round(double a, int d) 小數部分d位之後數字四捨五入,例如round(21.263,2),返回21.26
BIGINT floor(double a) 對給定數據進行向下舍入最接近的整數。例如floor(21.2),返回21
BIGINT ceil(double a), ceiling(double a) 將參數向上舍入爲最接近的整數。例如ceil(21.2),返回23
double rand(), rand(int seed) 返回大於或等於0且小於1的平均分佈隨機數(依重新計算而變)
double exp(double a) 返回e的n次方
double ln(double a) 返回給定數值的自然對數
double log10(double a) 返回給定數值的以10爲底自然對數
double log2(double a) 返回給定數值的以2爲底自然對數
double log(double base, double a) 返回給定底數及指數返回自然對數

舉例:hive> select log(4,256) from lxw_dual,返回4.0

double pow(double a, double p) power(double a, double p) 返回某數的乘冪
double sqrt(double a) 返回數值的平方根
string bin(BIGINT a) 返回二進制格式,參考:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_hex
string hex(BIGINT a) hex(string a) 將整數或字符轉換爲十六進制格式。參考:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_hex
string unhex(string a) 十六進制字符轉換由數字表示的字符。
string conv(BIGINT num, int from_base, int to_base)

將指定數值,由原來的度量體系轉換爲指定的試題體系。例如CONV(‘a’,16,2),返回:’1010′

參考:http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_conv

double abs(double a) 取絕對值
int double pmod(int a, int b) pmod(double a, double b) 返回a除b的餘數的絕對值pmod(9,4),返回1;pmod(-9,4),返回3.(因爲餘數不能爲負數)
double sin(double a) 返回給定角度的正弦值
double asin(double a) 返回x的反正弦,即是X。如果X是在-1到1的正弦值,返回NULL。
double cos(double a) 返回餘弦
double acos(double a) 返回X的反餘弦,即餘弦是X,,如果-1<= A <= 1,否則返回null.
int double positive(int a) positive(double a) 返回A的值,例如positive(2),返回2。
int double negative(int a) negative(double a) 返回A的相反數,例如negative(2),返回-2。

2.2收集函數

返回類型 函數 說明
int size(Map<K.V>) 返回的map類型的元素的數量,size(map('100','tom','101','mary')),返回2
int size(Array<T>) 返回數組類型的元素數量,size(array('100','101','102','103')),返回4

2.3類型轉換函數

返回類型 函數 說明
指定 “type” cast(expr as <type>)

類型轉換。例如將字符”1″轉換爲整數:cast(’1′ as bigint),如果轉換失敗返回NULL

cast ('2015-11-08' as date),返回2015-11-08;字符串數據轉爲日期型數據

2.4日期函數

返回類型 函數 說明
string from_unixtime(bigint unixtime[, string format]) UNIX_TIMESTAMP參數表示返回一個值’YYYY- MM – DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式,這取決於是否是在一個字符串或數字語境中使用的功能。該值表示在當前的時區。
bigint unix_timestamp() 如果不帶參數的調用,返回一個Unix時間戳(從’1970- 01 – 0100:00:00′到現在的UTC秒數)爲無符號整數。
bigint unix_timestamp(string date) 指定日期參數調用UNIX_TIMESTAMP(),它返回參數值’1970- 01 – 0100:00:00′到指定日期的秒數。
bigint unix_timestamp(string date, string pattern) 指定時間輸入格式,返回到1970年秒數:unix_timestamp(’2009-03-20′, ‘yyyy-MM-dd’) = 1237532400 參考:http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html
string to_date(string timestamp) 返回時間中的年月日: to_date(“1970-01-01 00:00:00″) = “1970-01-01″
string to_dates(string date) 給定一個日期date,返回一個天數(0年以來的天數)
int year(string date) 返回指定時間的年份,範圍在1000到9999,或爲”零”日期的0。
int month(string date) 返回指定時間的月份,範圍爲1至12月,或0一個月的一部分,如’0000-00-00′或’2008-00-00′的日期。
int day(string date) dayofmonth(date) 返回指定時間的日期
int hour(string date) 返回指定時間的小時,範圍爲0到23。
int minute(string date) 返回指定時間的分鐘,範圍爲0到59。
int second(string date) 返回指定時間的秒,範圍爲0到59。
int weekofyear(string date) 返回指定日期是一年中的第幾個星期,範圍爲0到53。(返回日期在當前的週數)
int datediff(string enddate, string startdate) 兩個時間參數的日期之差。
int date_add(string startdate, int days) 給定時間,在此基礎上加上指定的時間段。
int date_sub(string startdate, int days) 給定時間,在此基礎上減去指定的時間段。

2.5條件函數

返回類型 函數 說明
T if(boolean testCondition, T valueTrue, T valueFalseOrNull) 判斷是否滿足條件,如果滿足返回一個值,如果不滿足則返回另一個值。
T COALESCE(T v1, T v2, …) 返回一組數據中,第一個不爲NULL的值,如果均爲NULL,返回NULL。
T CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END 當a=b時,返回c;當a=d時,返回e,否則返回f。
T CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END 當值爲a時返回b,當值爲c時返回d。否則返回e。

2.6字符函數(操作對象:字符串)

返回類型 函數 說明
int length(string A) 返回字符串的長度,length('abcedfg'),返回7
string reverse(string A) 返回倒序字符串,reverse(abcedfg’),返回gfdecba
string concat(string A, string B…)

連接多個字符串,合併爲一個字符串,可以接受任意數量的輸入字符串

舉例:concat(‘abc’,'def’,'gh’),返回abcdefgh

string concat_ws(string SEP, string A, string B…)

鏈接多個字符串,字符串之間以指定的分隔符分開

舉例:concat_ws(',','abc','def','gh'),返回abc,def,gh

string substr(string A, int start) substring(string A, int start)

從文本字符串中指定的起始位置後的字符

舉例:substr('abcde',3),返回cde;substring('abcde',3),返回cde;

substr('abcde',-1),返回e

string substr(string A, int start, int len) substring(string A, int start, int len) 從文本字符串中指定的位置指定長度的字符。
string upper(string A) ucase(string A) 將文本字符串轉換成字母全部大寫形式
string lower(string A) lcase(string A) 將文本字符串轉換成字母全部小寫形式
string trim(string A) 刪除字符串兩端的空格,字符之間的空格保留
string ltrim(string A) 刪除字符串左邊的空格,其他的空格保留
string rtrim(string A) 刪除字符串右邊的空格,其他的空格保留
string regexp_replace(string A, string B, string C)

字符串A中的B字符被C字符替代,regexp_replace('foobar', 'oo|ar', ''),返回

fb

string regexp_extract(string subject, string pattern, int index) 通過下標返回正則表達式指定的部分。regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) returns ‘bar.’
string parse_url(string urlString, string partToExtract [, string keyToExtract])

返回URL指定的部分。parse_url(‘http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1′, ‘HOST’) 返回:’facebook.com’;

parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY','k1') 返回v1

string get_json_object(string json_string, string path) select a.timestamp, get_json_object(a.appevents, ‘$.eventid’), get_json_object(a.appenvets, ‘$.eventname’) from log a;
string space(int n) 返回指定數量的空格space(10)—>length(space(10))—>返回10
string repeat(string str, int n) 重複N次字符串
int ascii(string str) 返回字符串中首字符(第一個字符)的數字值(ascii碼)
string lpad(string str, int len, string pad) 返回指定長度的字符串,給定字符串長度小於指定長度時,由指定字符從左側填補。lpad('abc',10,'td'),返回tdtdtdtabc
string rpad(string str, int len, string pad) 返回指定長度的字符串,給定字符串長度小於指定長度時,由指定字符從右側填補。
array split(string str, string pat) 將字符串轉換爲數組,split('abtcdtef','t'),返回["ab","cd","ef"]
int find_in_set(string str, string strList) 返回字符串str第一次在strlist出現的位置。如果任一參數爲NULL,返回NULL;如果第一個參數包含逗號,返回0。find_in_set('ab','ef,ab,de'),返回2
array<array<string>> sentences(string str, string lang, string locale) 將字符串中內容按語句分組,每個單詞間以逗號分隔,最後返回數組。 例如sentences(‘Hello there! How are you?’) 返回:( (“Hello”, “there”), (“How”, “are”, “you”) )
array<struct<string,double>> ngrams(array<array<string>>, int N, int K, int pf) SELECT ngrams(sentences(lower(tweet)), 2, 100 [, 1000]) FROM twitter;
array<struct<string,double>> context_ngrams(array<array<string>>, array<string>, int K, int pf) SELECT context_ngrams(sentences(lower(tweet)), array(null,null), 100, [, 1000]) FROM twitter;

3.內置的聚合函數(UDAF)

返回類型 函數 說明
bigint count(*) , count(expr), count(DISTINCT expr[, expr_., expr_.]) 返回記錄條數。 count(*)統計檢索出的行的個數,包括NULL值的行;count(expr)返回指定字段的非空值的個數;count(DISTINCTexpr[, expr_.])返回指定字段的不同的非空值的個數
double sum(col), sum(DISTINCT col) 求和
double avg(col), avg(DISTINCT col) 求平均值
double min(col) 返回指定列中最小值
double max(col) 返回指定列中最大值
double var_pop(col) 返回指定列的方差
double var_samp(col) 返回指定列的樣本方差
double stddev_pop(col) 返回指定列的偏差
double stddev_samp(col) 返回指定列的樣本偏差
double covar_pop(col1, col2) 兩列數值協方差
double covar_samp(col1, col2) 兩列數值樣本協方差
double corr(col1, col2) 返回兩列數值的相關係數
double percentile(col, p) 返回數值區域的百分比數值點,(求準確的第pth個百分位數)。0<=P<=1,否則返回NULL,不支持浮點型數值。
array<double> percentile(col, array(p~1,,\ [, p,,2,,]…))

返回數值區域的一組百分比值分別對應的數值點。0<=P<=1,否則返回NULL,不支持浮點型數值。

percentile(score,<0.2,0.4>),返回0.20.4位置的數據

double percentile_approx(col, p[, B]) Returns an approximate p^th^ percentile of a numeric column (including floating point types) in the group. The B parameter controls approximation accuracy at the cost of memory. Higher values yield better approximations, and the default is 10,000. When the number of distinct values in col is smaller than B, this gives an exact percentile value.求近似的第pth個百分位數,p必須介於01之間,返回類型爲double,但是col字段支持浮點類型。參數B控制內存消耗的近似精度,B越大,結果的準確度越高。默認爲10,000。當col字段中的distinct值的個數小於B時,結果爲準確的百分位數
array<double> percentile_approx(col, array(p~1,, [, p,,2_]…) [, B]) Same as above, but accepts and returns an array of percentile values instead of a single one.功能和上述類似,之後後面可以輸入多個百分位數,返回類型也爲array<double>,其中爲對應的百分位數。
array<struct\{‘x’,'y’\}> histogram_numeric(col, b) Computes a histogram of a numeric column in the group using b non-uniformly spaced bins. The output is an array of size b of double-valued (x,y) coordinates that represent the bin centers and heights.b爲基準計算col的直方圖信息
array collect_set(col) 返回無重複記錄

4.內置表生成函數(UDTF)

返回類型 函數 說明
數組 explode(array<TYPE> a) 數組一條記錄中有多個參數,將參數拆分,每個參數生成一列。
  json_tuple get_json_object語句:select a.timestamp, get_json_object(a.appevents, ‘$.eventid’), get_json_object(a.appenvets, ‘$.eventname’) from log a; json_tuple語句: select a.timestamp, b.* from log a lateral view json_tuple(a.appevent, ‘eventid’, ‘eventname’) b as f1, f2

explode示例:

數組 SQL 返回
myCol 
[1,2] 
[3,4]
SELECT explode(myCol) AS myNewCol FROM myTable myNewCol



4

補充:

1.4.複合類型構造函數    
1) map結構
2) struct結構
3) named_struct結構
4) array結構
5) create_union

5.混合函數  
1) 調用Java函數:java_method
2) 調用Java函數:reflect
3) 字符串的hash值:hash


6.XPath解析XML函數   
1) xpath
2) xpath_string
3) xpath_boolean
4) xpath_short, xpath_int, xpath_long
5) xpath_float, xpath_double, xpath_number



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章