[Hive]-函数篇
1.函數分類
UDF 單進單出函數
UDAF 多進單出函數(比如Count,Sum...多個記錄輸出一個結果)
UDTF 單進多出函數(比如explode,一個記錄輸出多行結果)
2.操作符
A = B(等價A == B)? 值相等
A <==> B? Equals(兩個同時為Null為真,只有一個Null為假,否則Equals)
A <>B(等價A!=B) 不等于(同Null為假,只有一個NUll為真,否則Equals取反)
A [NOT] BETWEEN B AND C? ?[B,C]A是否在B,C之間(包含邊界B,C)
A IS?[NOT]? NULL? A是否為Null
A [NOT] LIKE B 同MySQL Like操作符
A RLIKE B (等價A REGEXP B)? ?模糊匹配(正則)
A DIV B A除以B的整數部分(小數直接攝取)
3.復雜對象
map(key1, value1, key2, value2, ...)? 用指定的鍵值創建一個Map對象
struct(val1, val2, val3, ...) 用指定的值創建一個struct對象,字段名依次為col1.col2.....
named_struct(name1, val1, name2, val2, ...)?用指定的字段名,字段值創建一個struct對象
array(val1, val2, ...)? 用指定的值創建一個array對象
create_union(tag, val1, val2, ...)??使用標記參數指向的值創建一個聯合類型
A[n] 獲取數組對象A下標為n的值
M[key] 獲取鍵值對對象M的鍵為key的值
S.x? 獲取結構體S的字段x的值
?
size(Map<K.V>)?size(Array<T>) 返回Map或數組的元素個數
map_keys(Map<K.V>)? 返回Map的鍵數組對象
map_values(Map<K.V>)??返回Map的值數組對象
array_contains(Array<T>, value) 返回Map是否包含指定的值
sort_array(Array<T>) 數組排序(升序)
4.UDF函數
4.1 數學函數
round(DOUBLE a)? 返回a的四舍五入的值
round(DOUBLE a, INT d) 返回a四舍五入保留d位小數的值
bround(DOUBLE a [, INT d]) 返回a的高斯四舍五入的值
floor(DOUBLE a) 返回a向上取整的值
ceil(DOUBLE a), ceiling(DOUBLE a) 返回a向下取整的值
rand(), rand(INT seed) 返回一個隨機數
greatest(T v1, T v2, ...) 返回指定值中最大的值
least(T v1, T v2, ...) 返回指定值中最小的值
4.2 類型轉換函數
cast(expr as <type>) 將 expr轉換為<type>類型
4.3 日期函數
from_unixtime(bigint unixtime[, string format]) 將一個時間戳轉換為指定格式的字符串,默認(yyyy-MM-dd)
unix_timestamp() 獲取當前時間時間戳(秒)
unix_timestamp(string date [, string pattern]) 將一個pattern格式(默認yyyy-MM-dd hh:mm:ss)的字符串轉換為時間戳
to_date(string timestamp) 將一個時間戳轉換為yyyy-MM-dd
?
quarter(date/timestamp/string)??返回日期、時間戳或范圍為1到4的字符串的季度
year(string date) 返回字符串日期的年?year("1970-01-01 00:00:00") = 1970, year("1970-01-01") = 1970
month(string date)??返回字符串日期的月
day(string date) dayofmonth(date)?返回字符串日期的天
hour(string date)?返回字符串日期的小時
minute(string date)?返回字符串日期的分鐘
second(string date) 返回字符串日期的秒
weekofyear(string date)? ?返回字符串日期的星期幾
extract(field FROM source) 從時間source中提取屬性信息
select extract(month from "2016-10-20") results in 10.
select extract(hour from "2016-10-20 05:06:07") results in 5.
select extract(dayofweek from "2016-10-20 05:06:07") results in 5.
select extract(month from interval '1-3' year to month) results in 3.
select extract(minute from interval '3 12:20:30' day to second) results in 20.
datediff(string enddate, string startdate) 返回兩個日期差異的天數(記住第一個參數是結束日期,第二個參數是開始日期)
date_add(date/timestamp/string?startdate, tinyint/smallint/int days) 返回指定日期加days天的日期
date_sub(date/timestamp/string?startdate, tinyint/smallint/int days) 返回指定日期減去days天的日期
current_date 返回當前日期
current_timestamp 返回當前日期時間戳
4.4 條件函數
if(boolean testCondition, T valueTrue, T valueFalseOrNull)? 如果testCondition表達式結果為真返回valueTrue,否則返回valueFalseOrNull
isnull( a ) 返回a是否為Null
isnotnull ( a ) 返回a是否不會Null
nvl(T value, T default_value)? 如果value不為Null則返回value,否則返回default_value
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END 如果a為真返回b 否則c
4.5 字符串函數
character_length(string str) 返回字符串在UTF8編碼下的長度
concat(string|binary A, string|binary B...) 多個字符串拼接
concat_ws(string SEP, string A, string B...)??多個字符串拼接,中間用SEP連接
split(string str, string pat) 字符串用pa分割成多段數組
substr(string|binary A, int start [, int len]) 字符串從start之后截取[len位], 從1開始,? substr('foobar', 4)? =? 'bar'?
6. UDTF函數
UDTF函數語法限制:
使用UDTF函數,不能再跟上其它的表達式 (禁止 UDTF(),其它列或表達式)
UDTF函數不能再嵌套使用其它的UDTF函數
UDTF函數不能再使用GROUP BY / CLUSTER BY / DISTRIBUTE BY / SORT BY
常用UDTF函數
explode(ARRAY<T> a) 將一個數組對象轉換為多行記錄,每行記錄一列
explode(MAP<Tkey,Tvalue> m) 將一個Map對象轉換為多行記錄,每行記錄有兩列,[key,value]
posexplode(ARRAY<T> a) 將一個數組對象轉換為多行記錄.每行記錄有兩列,[數組下標,值]
inline(ARRAY<STRUCT<f1:T1,...,fn:Tn>> a) 將一個數組結構體對象轉換為多行記錄,每行記錄的列對應結構體的屬性
stack(int r,T1?V1,...,Tn/r?Vn)
json_tuple(string?jsonStr,string?k1,...,string?kn) 將一個Json字符串轉換為多行數據,每行記錄的列來自后續列指定k1...kn(只有后續指定的列才會讀取)
parse_url_tuple(string?urlStr,string?p1,...,string?pn) 將一個URL地址字符串解析成單行多列信息?
parse_url_tuple('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1','HOST', 'PATH', 'QUERY',? 'QUERY:k1', 'QUERY:k2')
facebook.com /path1/p.php k1=v1&k2=v2 v1 v2
7. UDAF函數
sum() count()......
更多函數見官網?https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
8.開窗函數
8.1 OVER?字句
OVER?字句,可以使用在所有的標準聚合函數中(COUNT,SUM,MIN,MAX,AVG),或者特有分析函數(RANK|ROW_NUMBER.....),并且在2.1.0之后,支持DISTINCT關鍵字和Over字句內嵌套標準聚合函數
[COUNT|SUM|MIN|MAX|AVG|......]??OVER ( PARTITION BY <字段A....> ORDER BY?<字段A....>? [DESC])
PARTITION BY 字段,表示按字段分組 后續?ORDER BY 字段 表示分組內按字段排序
8.2 示例
COUNT(DISTINCT?a) OVER (PARTITION?BY?c) 按c分組后,在每個分組內對a執行去重計數
select* from? (
select? name,dept,age row_number()? over?(patition by?dept order by age) as idx from employee
) as t where t.idx <=2? 查詢每個部門的成員中年級最小的兩位
8.自定義函數
8.1 函數的定義
所有Hive的函數都是繼承UDF類的Java子類.自定義函數就是實現UDF類,并將jar注冊到Hive的過程.
1.Maven導入??hive-exec?hadoop-common,
2.定義一個類繼承UDF,并實現需要的evaluate方法
8.2 注冊到Hive
注意函數名注冊最好才采用全小寫+_形式,因為函數名會全部轉為小寫,會失去駝峰
8.2.1 臨時函數
臨時函數隨會話相關,所以創建的函數可以用在任意數據庫中,但會話切換就會立即失敗
8.2.1.1 jar注冊
臨時注冊 add jar jar本地路徑
永久注冊 將jar拷貝到Hive的lib文件夾(需要重啟hive)
8.2.1.2 臨時函數注冊
CREATE TEMPORARY FUNCTION function_name AS "class_name(類的全名:包+類名)";
8.2.2 永久函數注冊
永久函數隨數據庫相關,作為數據庫元數據的一部分,所以切換會話仍可使用,但必須顯示聲明所處的數據庫
永久函數的Jar文件是必須放入HDFS的.
CREATE FUNCTION [db_name.]function_name AS class_name?[USING JAR|FILE|ARCHIVE?'file_uri'?[, JAR|FILE|ARCHIVE?'file_uri'] ];
8.3 函數的刪除
? DROP [TEMPORARY] FUNCTION [IF EXISTS] function_name;
8.4 函數的注冊機制以及自動注冊
Hive的函數注冊其實是FunctionRegistry類的結果.
默認函數也是要基于同樣的注冊流程.之所以默認函數不注冊,是因為FunctionRegistry的靜態方法實現了默認函數的自動注冊
如果需要實現自動注冊,照此執行即可(需要編輯源碼重新編譯Hive哦)
?
轉載于:https://www.cnblogs.com/NightPxy/p/9153255.html
總結
以上是生活随笔為你收集整理的[Hive]-函数篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue实例API
- 下一篇: 辽宁舰过海峡 歼-11护卫轰-6K绕飞?