21Hive函數(shù)(hive學(xué)習(xí)4)

1.內(nèi)置運(yùn)算符

1.1關(guān)系運(yùn)算符

運(yùn)算符 類型 說(shuō)明
A = B 所有原始類型 如果A與B相等,返回TRUE,否則返回FALSE
A == B 無(wú) 失敗,因?yàn)闊o(wú)效的語(yǔ)法。 SQL使用”=”,不使用”==”。
A <> B(不等于) 所有原始類型 如果A不等于B返回TRUE,否則返回FALSE。如果A或B值為”NULL”,結(jié)果返回”NULL”。
A < B 所有原始類型 如果A小于B返回TRUE,否則返回FALSE。如果A或B值為”NULL”,結(jié)果返回”NULL”。
A <= B 所有原始類型 如果A小于等于B返回TRUE,否則返回FALSE。如果A或B值為”NULL”,結(jié)果返回”NULL”。
A > B 所有原始類型 如果A大于B返回TRUE,否則返回FALSE。如果A或B值為”NULL”,結(jié)果返回”NULL”。
A >= B 所有原始類型 如果A大于等于B返回TRUE,否則返回FALSE。如果A或B值為”NULL”,結(jié)果返回”NULL”。
A IS NULL 所有類型 如果A值為”NULL”,返回TRUE,否則返回FALSE
A IS NOT NULL 所有類型 如果A值不為”NULL”,返回TRUE,否則返回FALSE
A LIKE B 字符串 如 果A或B值為”NULL”,結(jié)果返回”NULL”。字符串A與B通過(guò)sql進(jìn)行匹配,如果相符返回TRUE,不符返回FALSE。B字符串中 的””代表任一字符,”%”則代表多個(gè)任意字符。例如: (‘foobar’ like ‘foo’)返回FALSE,( ‘foobar’ like ‘foo _ _’或者 ‘foobar’ like ‘foo%’)則返回TURE
A RLIKE B 字符串 如 果A或B值為”NULL”,結(jié)果返回”NULL”。字符串A與B通過(guò)java進(jìn)行匹配,如果相符返回TRUE,不符返回FALSE。例如:( ‘foobar’ rlike ‘foo’)返回FALSE,(’foobar’ rlike ‘^f.*r$’ )返回TRUE。
A REGEXP B 字符串 與RLIKE相同。

1.2算術(shù)運(yùn)算符

運(yùn)算符 類型 說(shuō)明
A + B 所有數(shù)字類型 A和B相加。結(jié)果的與操作數(shù)值有共同類型。例如每一個(gè)整數(shù)是一個(gè)浮點(diǎn)數(shù),浮點(diǎn)數(shù)包含整數(shù)。所以,一個(gè)浮點(diǎn)數(shù)和一個(gè)整數(shù)相加結(jié)果也是一個(gè)浮點(diǎn)數(shù)。
A – B 所有數(shù)字類型 A和B相減。結(jié)果的與操作數(shù)值有共同類型。
A * B 所有數(shù)字類型 A和B相乘,結(jié)果的與操作數(shù)值有共同類型。需要說(shuō)明的是,如果乘法造成溢出,將選擇更高的類型。
A / B 所有數(shù)字類型 A和B相除,結(jié)果是一個(gè)double(雙精度)類型的結(jié)果。
A % B 所有數(shù)字類型 A除以B余數(shù)與操作數(shù)值有共同類型。
A & B(按位與) 所有數(shù)字類型 運(yùn)算符查看兩個(gè)參數(shù)的二進(jìn)制表示法的值,并執(zhí)行按位”與”操作。兩個(gè)表達(dá)式的一位均為1時(shí),則結(jié)果的該位為 1。否則,結(jié)果的該位為 0。
A B 所有數(shù)字類型 運(yùn)算符查看兩個(gè)參數(shù)的二進(jìn)制表示法的值,并執(zhí)行按位”或”操作。只要任一表達(dá)式的一位為 1,則結(jié)果的該位為 1。否則,結(jié)果的該位為 0。
A ^ B 所有數(shù)字類型 運(yùn)算符查看兩個(gè)參數(shù)的二進(jìn)制表示法的值,并執(zhí)行按位”異或”操作。當(dāng)且僅當(dāng)只有一個(gè)表達(dá)式的某位上為 1 時(shí),結(jié)果的該位才為 1。否則結(jié)果的該位為 0。
~A 所有數(shù)字類型 對(duì)一個(gè)表達(dá)式執(zhí)行按位”非”(取反)。

1.3邏輯運(yùn)算符

運(yùn)算符 類型 說(shuō)明
A AND B 布爾值 A和B同時(shí)正確時(shí),返回TRUE,否則FALSE。如果A或B值為NULL,返回NULL。
A && B 布爾值 與”A AND B”相同
A OR B 布爾值 A或B正確,或兩者同時(shí)正確返返回TRUE,否則FALSE。如果A和B值同時(shí)為NULL,返回NULL。
A B 布爾值 與”A OR B”相同
NOT A 布爾值 如果A為NULL或錯(cuò)誤的時(shí)候返回TURE,否則返回FALSE。
! A 布爾值 與”NOT A”相同

1.4復(fù)雜類型函數(shù)

函數(shù) 類型 說(shuō)明
map (key1, value1, key2, value2, …) 通過(guò)指定的鍵/值對(duì),創(chuàng)建一個(gè)map。
struct (val1, val2, val3, …) 通過(guò)指定的字段值,創(chuàng)建一個(gè)結(jié)構(gòu)。結(jié)構(gòu)字段名稱將COL1,COL2,…
array (val1, val2, …) 通過(guò)指定的元素,創(chuàng)建一個(gè)數(shù)組。

1.5對(duì)復(fù)雜類型函數(shù)操作

函數(shù) 類型 說(shuō)明
A[n] A是一個(gè)數(shù)組,n為int型 返回?cái)?shù)組A的第n個(gè)元素,第一個(gè)元素的索引為0。如果A數(shù)組為['foo','bar'],則A[0]返回’foo’和A[1]返回”bar”。
M[key] M是Map<K, V>,關(guān)鍵K型 返回關(guān)鍵值對(duì)應(yīng)的值,例如mapM為 {‘f’ -> ‘foo’, ‘b’ -> ‘bar’, ‘a(chǎn)ll’ -> ‘foobar’},則M['all'] 返回’foobar’。
S.x S為struct 返回結(jié)構(gòu)x字符串在結(jié)構(gòu)S中的存儲(chǔ)位置。如 foobar {int foo, int bar} foobar.foo的領(lǐng)域中存儲(chǔ)的整數(shù)。

2.內(nèi)置函數(shù)

2.1數(shù)學(xué)函數(shù)

返回類型 函數(shù) 說(shuō)明
BIGINT round(double a) 四舍五入
DOUBLE round(double a, int d) 小數(shù)部分d位之后數(shù)字四舍五入,例如round(21.263,2),返回21.26
BIGINT floor(double a) 對(duì)給定數(shù)據(jù)進(jìn)行向下舍入最接近的整數(shù)。例如floor(21.2),返回21。
BIGINT ceil(double a), ceiling(double a) 將參數(shù)向上舍入為最接近的整數(shù)。例如ceil(21.2),返回23.
double rand(), rand(int seed) 返回大于或等于0且小于1的平均分布隨機(jī)數(shù)(依重新計(jì)算而變)
double exp(double a) 返回e的n次方
double ln(double a) 返回給定數(shù)值的自然對(duì)數(shù)
double log10(double a) 返回給定數(shù)值的以10為底自然對(duì)數(shù)
double log2(double a) 返回給定數(shù)值的以2為底自然對(duì)數(shù)
double log(double base, double a) 返回給定底數(shù)及指數(shù)返回自然對(duì)數(shù)
double pow(double a, double p) power(double a, double p) 返回某數(shù)的乘冪
double sqrt(double a) 返回?cái)?shù)值的平方根
string bin(BIGINT a) 返回二進(jìn)制格式
string hex(BIGINT a) hex(string a) 將整數(shù)或字符轉(zhuǎn)換為十六進(jìn)制格式
string unhex(string a) 十六進(jìn)制字符轉(zhuǎn)換由數(shù)字表示的字符。
string conv(BIGINT num, int from_base, int to_base) 將 指定數(shù)值,由原來(lái)的度量體系轉(zhuǎn)換為指定的試題體系。例如CONV(‘a(chǎn)’,16,2),返回。參考:’1010′ http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_conv
double abs(double a) 取絕對(duì)值
int double pmod(int a, int b) pmod(double a, double b) 返回a除b的余數(shù)的絕對(duì)值
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的相反數(shù),例如negative(2),返回-2。

2.2收集函數(shù)

返回類型 函數(shù) 說(shuō)明
int size(Map<K.V>) 返回的map類型的元素的數(shù)量
int size(Array<T>) 返回?cái)?shù)組類型的元素?cái)?shù)量

2.3類型轉(zhuǎn)換函數(shù)

返回類型 函數(shù) 說(shuō)明
指定 “type” cast(expr as <type>) 類型轉(zhuǎn)換。例如將字符”1″轉(zhuǎn)換為整數(shù):cast(’1′ as bigint),如果轉(zhuǎn)換失敗返回NULL。

2.4日期函數(shù)

返回類型 函數(shù) 說(shuō)明
string from_unixtime(bigint unixtime[, string format]) UNIX_TIMESTAMP參數(shù)表示返回一個(gè)值’YYYY- MM – DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式,這取決于是否是在一個(gè)字符串或數(shù)字語(yǔ)境中使用的功能。該值表示在當(dāng)前的時(shí)區(qū)。
bigint unix_timestamp() 如果不帶參數(shù)的調(diào)用,返回一個(gè)Unix時(shí)間戳(從’1970- 01 – 0100:00:00′到現(xiàn)在的UTC秒數(shù))為無(wú)符號(hào)整數(shù)。
bigint unix_timestamp(string date) 指定日期參數(shù)調(diào)用UNIX_TIMESTAMP(),它返回參數(shù)值’1970- 01 – 0100:00:00′到指定日期的秒數(shù)。
bigint unix_timestamp(string date, string pattern) 指定時(shí)間輸入格式,返回到1970年秒數(shù):unix_timestamp(’2009-03-20′, ‘yyyy-MM-dd’) = 1237532400
string to_date(string timestamp) 返回時(shí)間中的年月日: to_date(“1970-01-01 00:00:00″) = “1970-01-01″
string to_dates(string date) 給定一個(gè)日期date,返回一個(gè)天數(shù)(0年以來(lái)的天數(shù))
int year(string date) 返回指定時(shí)間的年份,范圍在1000到9999,或?yàn)椤绷恪比掌诘?。
int month(string date) 返回指定時(shí)間的月份,范圍為1至12月,或0一個(gè)月的一部分,如’0000-00-00′或’2008-00-00′的日期。
int day(string date) dayofmonth(date) 返回指定時(shí)間的日期
int hour(string date) 返回指定時(shí)間的小時(shí),范圍為0到23。
int minute(string date) 返回指定時(shí)間的分鐘,范圍為0到59。
int second(string date) 返回指定時(shí)間的秒,范圍為0到59。
int weekofyear(string date) 返回指定日期所在一年中的星期號(hào),范圍為0到53。
int datediff(string enddate, string startdate) 兩個(gè)時(shí)間參數(shù)的日期之差。
int date_add(string startdate, int days) 給定時(shí)間,在此基礎(chǔ)上加上指定的時(shí)間段。
int date_sub(string startdate, int days) 給定時(shí)間,在此基礎(chǔ)上減去指定的時(shí)間段。

2.5條件函數(shù)

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

2.6字符函數(shù)

返回類型 函數(shù) 說(shuō)明
int length(string A) 返回字符串的長(zhǎng)度
string reverse(string A) 返回倒序字符串
string concat(string A, string B…) 連接多個(gè)字符串,合并為一個(gè)字符串,可以接受任意數(shù)量的輸入字符串
string concat_ws(string SEP, string A, string B…) 鏈接多個(gè)字符串,字符串之間以指定的分隔符分開。
string substr(string A, int start) substring(string A, int start) 從文本字符串中指定的起始位置后的字符。
string substr(string A, int start, int len) substring(string A, int start, int len) 從文本字符串中指定的位置指定長(zhǎng)度的字符。
string upper(string A) ucase(string A) 將文本字符串轉(zhuǎn)換成字母全部大寫形式
string lower(string A) lcase(string A) 將文本字符串轉(zhuǎn)換成字母全部小寫形式
string trim(string A) 刪除字符串兩端的空格,字符之間的空格保留
string ltrim(string A) 刪除字符串左邊的空格,其他的空格保留
string rtrim(string A) 刪除字符串右邊的空格,其他的空格保留
string regexp_replace(string A, string B, string C) 字符串A中的B字符被C字符替代
string regexp_extract(string subject, string pattern, int index) 通過(guò)下標(biāo)返回正則表達(dá)式指定的部分。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
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) 返回指定數(shù)量的空格
string repeat(string str, int n) 重復(fù)N次字符串
int ascii(string str) 返回字符串中首字符的數(shù)字值
string lpad(string str, int len, string pad) 返回指定長(zhǎng)度的字符串,給定字符串長(zhǎng)度小于指定長(zhǎng)度時(shí),由指定字符從左側(cè)填補(bǔ)。
string rpad(string str, int len, string pad) 返回指定長(zhǎng)度的字符串,給定字符串長(zhǎng)度小于指定長(zhǎng)度時(shí),由指定字符從右側(cè)填補(bǔ)。
array split(string str, string pat) 將字符串轉(zhuǎn)換為數(shù)組。
int find_in_set(string str, string strList) 返回字符串str第一次在strlist出現(xiàn)的位置。如果任一參數(shù)為NULL,返回NULL;如果第一個(gè)參數(shù)包含逗號(hào),返回0。
array<array<string>> sentences(string str, string lang, string locale) 將字符串中內(nèi)容按語(yǔ)句分組,每個(gè)單詞間以逗號(hào)分隔,最后返回?cái)?shù)組。 例如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.內(nèi)置的聚合函數(shù)(UDAF)

返回類型 函數(shù) 說(shuō)明
bigint count(*) , count(expr), count(DISTINCT expr[, expr_., expr_.]) 返回記錄條數(shù)。
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) 兩列數(shù)值協(xié)方差
double covar_samp(col1, col2) 兩列數(shù)值樣本協(xié)方差
double corr(col1, col2) 返回兩列數(shù)值的相關(guān)系數(shù)
double percentile(col, p) 返回?cái)?shù)值區(qū)域的百分比數(shù)值點(diǎn)。0<=P<=1,否則返回NULL,不支持浮點(diǎn)型數(shù)值。
array<double> percentile(col, array(p~1,,\ [, p,,2,,]…)) 返回?cái)?shù)值區(qū)域的一組百分比值分別對(duì)應(yīng)的數(shù)值點(diǎn)。0<=P<=1,否則返回NULL,不支持浮點(diǎn)型數(shù)值。
double percentile_approx(col, p[, B]) Returns an approximate pth 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.
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<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
array collect_set(col) 返回?zé)o重復(fù)記錄

4.內(nèi)置表生成函數(shù)(UDTF)

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

5.自定義函數(shù)

自定義函數(shù)包括三種UDF、UDAF、UDTF

UDF(User-Defined-Function) 一進(jìn)一出

UDAF(User- Defined Aggregation Funcation) 聚集函數(shù),多進(jìn)一出。Count/max/min

UDTF(User-Defined Table-Generating Functions) 一進(jìn)多出,如lateral view explore()

使用方式 :在HIVE會(huì)話中add 自定義函數(shù)的jar文件,然后創(chuàng)建function繼而使用函數(shù)

5.1 UDF開發(fā)

1、UDF函數(shù)可以直接應(yīng)用于select語(yǔ)句,對(duì)查詢結(jié)構(gòu)做格式化處理后,再輸出內(nèi)容。

2、編寫UDF函數(shù)的時(shí)候需要注意一下幾點(diǎn):

a)自定義UDF需要繼承org.apache.hadoop.hive.ql.UDF。

b)需要實(shí)現(xiàn)evaluate函數(shù),evaluate函數(shù)支持重載。


代碼實(shí)現(xiàn)

3、步驟

a)把程序打包放到目標(biāo)機(jī)器上去;

b)進(jìn)入hive客戶端,添加jar包:hive>add jar /run/jar/udf_test.jar;

c)創(chuàng)建臨時(shí)函數(shù):hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';
hive>CREATE TEMPORARY FUNCTION add_example(jar包名name) AS 'hive.udf.Add';(類名classname)
d)查詢HQL語(yǔ)句:

SELECT add_example(8, 9) FROM scores;

SELECT add_example(scores.math, scores.art) FROM scores;

SELECT add_example(6, 7, 8, 6.8) FROM scores;

e)銷毀臨時(shí)函數(shù):hive> DROP TEMPORARY FUNCTION add_example;

5.2 UDAF 自定義集函數(shù)

多行進(jìn)一行出,如sum()、min(),用在group by時(shí)

1.必須繼承

}org.apache.hadoop.hive.ql.exec.UDAF(函數(shù)類繼承)

} org.apache.hadoop.hive.ql.exec.UDAFEvaluator(內(nèi)部類Evaluator實(shí)現(xiàn)UDAFEvaluator接口)

2.Evaluator需要實(shí)現(xiàn) init、iterate、terminatePartial、merge、terminate這幾個(gè)函數(shù)

} init():類似于構(gòu)造函數(shù),用于UDAF的初始化

} iterate():接收傳入的參數(shù),并進(jìn)行內(nèi)部的輪轉(zhuǎn),返回boolean

} terminatePartial():無(wú)參數(shù),其為iterate函數(shù)輪轉(zhuǎn)結(jié)束后,返回輪轉(zhuǎn)數(shù)據(jù),類似于hadoop的Combiner

} merge():接收terminatePartial的返回結(jié)果,進(jìn)行數(shù)據(jù)merge操作,其返回類型為boolean

} terminate():返回最終的聚集函數(shù)結(jié)果

}開發(fā)一個(gè)功能同:

}Oracle的wm_concat()函數(shù)

}Mysql的group_concat()

Hive UDF的數(shù)據(jù)類型:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容