參考連結: Hive常用字元串函數
Hive中複合資料結構簡介以及一些函數的用法說明
數學函數
下面表格中的函數為Hive的内置數學函數,大部分當參數為NULL時傳回NULL。
傳回類型 | 函數名 | 描述 |
| round(double a) | 傳回a經過四舍五入的 值 |
double | round(double a, int d) | 傳回a經過四舍五入,保留d位小數的DOUBLE 值 |
bigint | floor(double a) | 傳回小于等于a的最大BIGINT 值 |
bigint | ceil(double a), ceiling(double a) | 傳回大于等于a的最小BIGINT 值 |
double | rand(), rand(int seed) | 傳回一個均勻分布在0到1之間的随機數,指定seed将會確定産生的随機數序列是确定的 |
double | exp(double a), exp(decimal a) | 傳回ea |
double | ln(double a), ln(decimal a) | 傳回a的自然對數值 |
double | log10(double a), log10(decimal a) | 傳回a的以10為底的對數值 |
double | log2(double a), log2(decimal a) | 傳回a的以2為底的對數值 |
double | log(double base, double a) | 傳回a以base為底的對數值,除了DOUBLE 類型,還可以是DECIMAL 類型,并且兩種類型可以混合使用 |
double | pow(double a, double p), power(double a, double p) | 傳回ap |
double | sqrt(double a), sqrt(decimal a) | 傳回a的平方根 |
string | bin(bigint a) | 傳回a的二進制格式 |
string | hex(bigint a) hex(string a) hex(binary a) | 如果參數為整數或者二進制,傳回十六進制的字元串,如果參數為字元串,該函數将每個字元轉換為十六進制表示,并傳回結果字元串 |
binary | unhex(string a) | 将每對字元解釋為十六進制并轉換為該十六進制的位元組表示 |
string | conv(bigint num, int from_base, int to_base), conv(string num, int from_base, int to_base) | 将數值從一種進制表示轉換為另一種進制,比如從二進制轉換為十進制 |
double | abs(double a) | 傳回a的絕對值 |
int or double | pmod(int a, int b), pmod(double a, double b) | 傳回a mod b的正數值 |
double | sin(double a), sin(decimal a) | 傳回a的正弦值,a為弧度值 |
double | asin(double a), asin(decimal a) | 如果1<=a<=-1,傳回a的反正弦值,否則傳回NULL |
double | cos(double a), cos(decimal a) | 傳回a的餘弦值,a為弧度值 |
double | acos(double a), acos(decimal a) | 如果-1<=a<=1,傳回a的反餘弦值,否則傳回NULL |
double | tan(double a), tan(decimal a) | 傳回a的正切值,a為弧度值 |
double | atan(double a), atan(decimal a) | 傳回a的反正切值 |
double | degrees(double a), degrees(decimal a) | 将a從弧度值轉換為對應的角度值 |
double | radians(double a), radians(double a) | 将a從角度值轉換為弧度值 |
int or double | positive(int a), positive(double a) | 傳回a |
int or double | negative(int a), negative(double a) | 傳回-a |
double or int | sign(double a), sign(decimal a) | 如果a為正數傳回1.0,若為負數傳回-1.0,否則傳回0.0。參數為DECIMAL 時傳回值為INT類型 |
double | e() | 傳回e的值 |
double | pi() | 傳回π的值 |
集合函數
下表為Hive中的集合函數。
傳回類型 | 函數名 | 描述 |
int | size(Map<K.V>) | 傳回map中的元素數量 |
int | size(Array<T>) | 傳回數組中的元素數量 |
array<K> | map_keys(Map<K.V>) | 傳回未經排序的包含map中keys的數組 |
array<V> | map_values(Map<K.V>) | 傳回未經排序的包含map中values的數組 |
boolean | array_contains(Array<T>, value) | 如果數組包含value,傳回true |
array<t> | sort_array(Array<T>) | 将數組按照升序排序并傳回 |
類型轉換函數
下表為Hive中的類型轉換函數。
傳回類型 | 函數名 | 描述 |
binary | binary(string|binary) | 将輸入參數轉換為binary |
<type> | cast(expr as <type>) | 将表達式的結果expr轉換為<type>,如果轉換不成功則傳回NULL,例如cast(‘2014-08-09’ as date) |
日期函數
下表中為Hive中的内置日期函數。
傳回類型 | 函數名 | 描述 |
string | from_unixtime(bigint unixtime[, string format]) | 将從unix時間(1970-01-01 00:00:00 UTC)開始的秒數轉換為表示目前系統時區的時間戳,格式為“1970-01-01 00:00:00” |
bigint | unix_timestamp() | 傳回目前Unix時間戳表示的秒數 |
bigint | unix_timestamp(string date) | 将格式為yyyy-MM-dd HH:mm:ss的字元串轉換為Unix時間戳(秒),使用預設的時區和區域,如果失敗傳回0 |
bigint | unix_timestamp(string date, string pattern) | 根據指定模式将時間字元串轉換為Unix時間戳(秒),失敗傳回0 |
string | to_date(string timestamp) | 傳回時間戳字元串的日期部分,如:to_date("1970-01-01 00:00:00") = "1970-01-01" |
int | year(string date) | 傳回日期或時間戳字元串的年部分,如: year("1970-01-01 00:00:00") = 1970, year("1970-01-01") = 1970 |
int | month(string date) | 傳回日期或時間戳字元串的月部分,如: month("1970-11-01 00:00:00") = 11, month("1970-11-01") = 11 |
int | day(string date) dayofmonth(date) | 傳回日期或時間戳字元串的天部分,如:day("1970-11-01 00:00:00") = 1, day("1970-11-01") = 1 |
int | hour(string date) | 傳回時間戳的小時部分: hour('2009-07-30 12:58:59') = 12, hour('12:58:59') = 12 |
int | minute(string date) | 傳回時間戳的分鐘 |
int | second(string date) | 傳回時間戳的秒 |
int | weekofyear(string date) | 傳回時間戳的星期數,如: weekofyear("1970-11-01 00:00:00") = 44, weekofyear("1970-11-01") = 44 |
int | datediff(string enddate, string startdate) | 傳回從startdate到enddate的天數,如: datediff('2009-03-01', '2009-02-27') = 2 |
string | date_add(string startdate, int days) | 向startdate增加指定的天數,如: date_add('2008-12-31', 1) = '2009-01-01' |
string | date_sub(string startdate, int days) | 從startdate減去指定的天數,如: date_sub('2008-12-31', 1) = '2008-12-30' |
timestamp | from_utc_timestamp(timestamp, string timezone) | 假設給定時間戳為UTC時間,并将其轉換為給定時區的時間戳 |
timestamp | to_utc_timestamp(timestamp, string timezone) | 假設給定時間戳為給定時區的時間,将其轉換為UTC時間戳 |
條件函數
下表為Hive支援的一些條件函數。
傳回類型 | 函數名 | 描述 |
T | if(boolean testCondition, T valueTrue, T valueFalseOrNull) | 如果testCondition為真,傳回valueTrue,否則傳回valueFalseOrNull |
T | COALESCE(T v1, T v2, ...) | 傳回第一個不是NULL的v,若全部為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=true傳回b,當c=true傳回d,其它傳回e |
字元串函數
下表為Hive内置的字元串函數。
傳回類型 | 函數名 | 描述 |
int | ascii(string str) | 傳回str第一個字元串的數值 |
string | base64(binary bin) | 将二進制參數轉換為base64字元串 |
string | concat(string|binary A, string|binary B...) | 傳回将A和B按順序連接配接在一起的字元串,如:concat('foo', 'bar') 傳回'foobar' |
array<struct<string,double>> | context_ngrams(array<array<string>>, array<string>, int K, int pf) | 從一組标記化的句子中傳回前k個文本 |
string | concat_ws(string SEP, string A, string B...) | 類似concat() ,但使用自定義的分隔符SEP |
string | concat_ws(string SEP, array<string>) | 類似concat_ws() ,但參數為字元串數組 |
string | decode(binary bin, string charset) | 使用指定的字元集将第一個參數解碼為字元串,如果任何一個參數為null,傳回null。可選字元集為: 'US_ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16' |
binary | encode(string src, string charset) | 使用指定的字元集将第一個參數編碼為binary ,如果任一參數為null,傳回null |
int | find_in_set(string str, string strList) | 傳回str在strList中第一次出現的位置,strList為用逗号分隔的字元串,如果str包含逗号則傳回0,若任何參數為null,傳回null。如: find_in_set('ab', 'abc,b,ab,c,def') 傳回3 |
string | format_number(number x, int d) | 将數字x格式化為'#,###,###.##',四舍五入為d位小數位,将結果做為字元串傳回。如果d=0,結果不包含小數點或小數部分 |
string | get_json_object(string json_string, string path) | 從基于json path的json字元串中提取json對象,傳回json對象的json字元串,如果輸入的json字元串無效傳回null。Json 路徑隻能有數字、字母和下劃線,不允許大寫和其它特殊字元 |
boolean | in_file(string str, string filename) | 如果str在filename中以正行的方式出現,傳回true |
int | instr(string str, string substr) | 傳回substr在str中第一次出現的位置。若任何參數為null傳回null,若substr不在str中傳回0。Str中第一個字元的位置為1 |
int | length(string A) | 傳回A的長度 |
int | locate(string substr, string str[, int pos]) | 傳回substr在str的位置pos後第一次出現的位置 |
string | lower(string A) lcase(string A) | 傳回字元串的小寫形式 |
string | lpad(string str, int len, string pad) | 将str左側用字元串pad填充,長度為len |
string | ltrim(string A) | 去掉字元串A左側的空格,如:ltrim(' foobar ')的結果為'foobar ' |
array<struct<string,double>> | ngrams(array<array<string>>, int N, int K, int pf) | 從一組标記化的Returns the top-k 句子中傳回前K個N-grams |
string | parse_url(string urlString, string partToExtract [, string keyToExtract]) | 傳回給定URL的指定部分,partToExtract的有效值包括HOST,PATH, QUERY, REF, PROTOCOL, AUTHORITY,FILE和USERINFO。例如: parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') 傳回 'facebook.com'.。當第二個參數為QUERY時,可以使用第三個參數提取特定參數的值,例如: parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1') 傳回'v1' |
string | printf(String format, Obj... args) | 将輸入參數進行格式化輸出 |
string | regexp_extract(string subject, string pattern, int index) | 使用pattern從給定字元串中提取字元串。如: regexp_extract('foothebar', 'foo(.*?)(bar)', 2) 傳回'bar' 有時需要使用預定義的字元類:使用'\s' 做為第二個參數将比對s,'s'比對空格等。參數index是Java正則比對器方法group()方法中的索引 |
string | regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT) | 使用REPLACEMENT替換字元串INITIAL_STRING中比對PATTERN的子串,例如: regexp_replace("foobar", "oo|ar", "") 傳回'fb' |
string | repeat(string str, int n) | 将str重複n次 |
string | reverse(string A) | 将字元串A翻轉 |
string | rpad(string str, int len, string pad) | 在str的右側使用pad填充至長度len |
string | rtrim(string A) | 去掉字元串A右側的空格,如: rtrim(' foobar ') 傳回 ' foobar' |
array<array<string>> | sentences(string str, string lang, string locale) | 将自然語言文本處理為單詞和句子,每個句子在适當的邊界分割,傳回單詞的數組。參數lang和local為可選參數,例如: sentences('Hello there! How are you?') 傳回( ("Hello", "there"), ("How", "are", "you") ) |
string | space(int n) | 傳回n個空格的字元串 |
array | split(string str, string pat) | 用pat分割字元串str,pat為正規表達式 |
map<string,string> | str_to_map(text[, delimiter1, delimiter2]) | 使用兩個分隔符将文本分割為鍵值對。第一個分隔符将文本分割為K-V 對,第二個分隔符分隔每個K-V 對。預設第一個分隔符為“,“,第二個分隔符為= |
string | substr(string|binary A, int start) substring(string|binary A, int start) | 傳回A從位置start直到結尾的子串 |
string | substr(string|binary A, int start, int len) substring(string|binary A, int start, int len) | 傳回A中從位置start開始,長度為len的子串,如: substr('foobar', 4, 1) 傳回 'b' |
string | translate(string input, string from, string to) | 将input中出現在from中的字元替換為to中的字元串,如果任何參數為null,結果為null |
string | trim(string A) | 去掉字元串A兩端的空格 |
binary | unbase64(string str) | 将base64字元串轉換為二進制 |
string | upper(string A) ucase(string A) | 傳回字元串A的大寫形式 |
聚合函數
下表為Hive内置的聚合函數。
傳回類型 | 函數名 | 描述 |
BIGINT | count(*) count(expr) count(DISTINCT expr[, expr_.]) | count(*) – 傳回檢索到的行的總數,包括含有NULL值的行。count(expr) – 傳回expr表達式不是NULL的行的數量count(DISTINCT expr[, expr]) – 傳回expr是唯一的且非NULL的行的數量 |
DOUBLE | sum(col) sum(DISTINCT col) | 對組内某列求和(包含重複值)或者對組内某列求和(不包含重複值) |
DOUBLE | avg(col), avg(DISTINCT col) | 對組内某列元素求平均值者(包含重複值或不包含重複值) |
DOUBLE | min(col) | 傳回組内某列的最小值 |
DOUBLE | max(col) | 傳回組内某列的最大值 |
DOUBLE | variance(col), 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(BIGINT col, p) | 傳回組内某個列精确的第p位百分數,p必須在0和1之間 |
array<double> | percentile(BIGINT col, array(p1 [, p2]...)) | 傳回組内某個列精确的第p1,p2,……位百分數,p必須在0和1之間 |
DOUBLE | percentile_approx(DOUBLE col, p [, B]) | 傳回組内數字列近似的第p位百分數(包括浮點數),參數B控制近似的精确度,B值越大,近似度越高,預設值為10000。當列中非重複值的數量小于B時,傳回精确的百分數 |
array<double> | percentile_approx(DOUBLE col, array(p1 [, p2]...) [, B]) | 同上,但接受并傳回百分數數組 |
array<struct {'x','y'}> | histogram_numeric(col, b) | 使用b個非均勻間隔的箱子計算組内數字列的柱狀圖(直方圖),輸出的數組大小為b,double類型的(x,y)表示直方圖的中心和高度 |
array | collect_set(col) | 傳回消除了重複元素的數組 |
array | collect_list(col) | 傳回允許重複元素的數組 |
INTEGER | ntile(INTEGER x) | 該函數将已經排序的分區分到x個桶中,并為每行配置設定一個桶号。這可以容易的計算三分位,四分位,十分位,百分位和其它通用的概要統計 |
内置 Table-Generating函數(UDTF)
正常的使用者定義函數,如concat,輸入一個單行然後輸出一個單行,但table-generating函數将一個單輸入行轉換為多個輸出行。下表為Hive内置的table-generating函數。
傳回類型 | 函數名 | 描述 |
N rows | explode(ARRAY) | 參數列為數組類型,将數組資料中的每個元素做為一行傳回 |
N rows | explode(MAP) | 将輸入map中的每個鍵值對轉換為兩列,一列為key,另一列為value,然後傳回新行 |
inline(ARRAY<STRUCT[,STRUCT]>) | 分解struct數組到表中 | |
Array Type | explode(array<TYPE> a) | 對于數組a中的每個元素,該函數産生包含該元素的行For |
元組 | json_tuple(jsonStr, k1, k2, ...) | 參數為一組鍵k1,k2……和JSON字元串,傳回值的元組。該方法比 高效,因為可以在一次調用中輸入多個鍵 |
元組 | parse_url_tuple(url, p1, p2, ...) | 該方法同 相似,但可以一次性提取URL的多個部分,有效的參數名稱為: HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, USERINFO, QUERY:<KEY> |
N rows | posexplode(ARRAY) | 行為與參數為數組的explode方法相似,但包含項在原始數組中的位置,傳回(pos,value)的二進制組 |
stack(INT n, v_1, v_2, ..., v_k) | 将v_1, ..., v_k 分為n行,每行包含n/k列,n必須為常數 |
使用文法”SELECT udtf(col) AS colAlias...”有以下幾點限制:
- 在SELECT中不允許再有其他表達式:不支援SELECT pageid, explode(adid_list) AS myCol...
- UDTF不能夠嵌套使用:不支援SELECT explode(explode(adid_list)) AS myCol...
- 不支援GROUP BY /CLUSTER BY / DISTRIBUTE BY / SORT BY:不支援SELECT explode(adid_list) AS myCol ... GROUP BY myCol