1. 程式人生 > 其它 >spark-sql 與hive 常用函式

spark-sql 與hive 常用函式

視窗函式與分析函式
應用場景:
(1)用於分割槽排序
(2)動態Group By
(3)Top N
(4)累計計算
(5)層次查詢

視窗函式
FIRST_VALUE:取分組內排序後,截止到當前行,第一個值
LAST_VALUE: 取分組內排序後,截止到當前行,最後一個值
LEAD(col,n,DEFAULT) :用於統計視窗內往下第n行值。第一個引數為列名,第二個引數為往下第n行(可選,預設為1),第三個引數為預設值(當往下第n行為NULL時候,取預設值,如不指定,則為NULL)
LAG(col,n,DEFAULT) :與lead相反,用於統計視窗內往上第n行值。第一個引數為列名,第二個引數為往上第n行(可選,預設為1),第三個引數為預設值(當往上第n行為NULL時候,取預設值,如不指定,則為NULL)

OVER從句
1、使用標準的聚合函式COUNT、SUM、MIN、MAX、AVG
2、使用PARTITION BY語句,使用一個或者多個原始資料型別的列
3、使用PARTITION BY與ORDER BY語句,使用一個或者多個數據型別的分割槽或者排序列
4、使用視窗規範,視窗規範支援以下格式:

當ORDER BY後面缺少視窗從句條件,視窗規範預設是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

當ORDER BY和視窗從句都缺失, 視窗規範預設是 ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

OVER從句支援以下函式, 但是並不支援和視窗一起使用它們。
Ranking函式: Rank, NTile, DenseRank, CumeDist, PercentRank.
Lead 和 Lag 函式.

分析函式
ROW_NUMBER() 從1開始,按照順序,生成分組內記錄的序列,比如,按照pv降序排列,生成分組內每天的pv名次,ROW_NUMBER()的應用場景非常多,再比如,獲取分組內排序第一的記錄;獲取一個session中的第一條refer等。
RANK() 生成資料項在分組中的排名,排名相等會在名次中留下空位
DENSE_RANK() 生成資料項在分組中的排名,排名相等會在名次中不會留下空位
CUME_DIST 小於等於當前值的行數/分組內總行數。比如,統計小於等於當前薪水的人數,所佔總人數的比例
PERCENT_RANK 分組內當前行的RANK值-1/分組內總行數-1
NTILE(n) 用於將分組資料按照順序切分成n片,返回當前切片值,如果切片不均勻,預設增加第一個切片的分佈。NTILE不支援ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)。

增強的聚合 Cube和Grouping 和Rollup
這幾個分析函式通常用於OLAP中,不能累加,而且需要根據不同維度上鑽和下鑽的指標統計,比如,分小時、天、月的UV數。

GROUPING SETS
在一個GROUP BY查詢中,根據不同的維度組合進行聚合,等價於將不同維度的GROUP BY結果集進行UNION ALL,
其中的GROUPING__ID,表示結果屬於哪一個分組集合。

CUBE
根據GROUP BY的維度的所有組合進行聚合。

數學函式

round(double d, int n):返回保留n位小數的近似d值
floor(double d): 返回小於d的最大整值
ceil(double d): 返回大於d的最小整值
rand(int seed): 返回隨機數,seed是隨機因子
bin(int d): 計算二進位制值d的string值
日期函式

to_date(string timestamp):返回時間字串中的日期部分,如to_date('1970-01-01 00:00:00')='1970-01-01'
current_date:返回當前日期
year(date):返回日期date的年,型別為int如year('2019-01-01')=2019
month(date):返回日期date的月,型別為int,如month('2019-01-01')=1
day(date): 返回日期date的天,型別為int,如day('2019-01-01')=1
weekofyear(date1):返回日期date1位於該年第幾周。如weekofyear('2019-03-06')=10
datediff(date1,date2):返回日期date1與date2相差的天數,如datediff('2019-03-06','2019-03-05')=1
date_add(date1,int1):返回日期date1加上int1的日期,如date_add('2019-03-06',1)='2019-03-07'
date_sub(date1,int1):返回日期date1減去int1的日期,如date_sub('2019-03-06',1)='2019-03-05'
months_between(date1,date2):返回date1與date2相差月份,如months_between('2019-03-06','2019-01-01')=2
add_months(date1,int1):返回date1加上int1個月的日期,int1可為負數。如add_months('2019-02-11',-1)='2019-01-11'
last_day(date1):返回date1所在月份最後一天。如last_day('2019-02-01')='2019-02-28'
next_day(date1,day1):返回日期date1的下個星期day1的日期。day1為星期X的英文前兩字母如next_day('2019-03-06','MO') 返回'2019-03-11'
trunc(date1,string1):返回日期最開始年份或月份。string1可為年(YYYY/YY/YEAR)或月(MONTH/MON/MM)。如trunc('2019-03-06','MM')='2019-03-01',trunc('2019-03-06','YYYY')='2019-01-01'
unix_timestamp():返回當前時間的unix時間戳,可指定日期格式。如unix_timestamp('2019-03-06','yyyy-mm-dd')=1546704180
from_unixtime():返回unix時間戳的日期,可指定格式。如select from_unixtime(unix_timestamp('2019-03-06','yyyy-mm-dd'),'yyyymmdd')='20190306'
條件函式

if(boolean,t1,t2):若布林值成立,則返回t1,反正返回t2。如if(1>2,100,200)返回200
case when boolean then t1 else t2 end:若布林值成立,則t1,否則t2,可加多重判斷
coalesce(v0,v1,v2):返回引數中的第一個非空值,若所有值均為null,則返回null。如coalesce(null,1,2)返回1
isnull(a):若a為null則返回true,否則返回false
字串函式

length(string1):返回字串長度
concat(string1,string2):返回拼接string1及string2後的字串
concat_ws(sep,string1,string2):返回按指定分隔符拼接的字串
lower(string1):返回小寫字串,同lcase(string1)。upper()/ucase():返回大寫字串
trim(string1):去字串左右空格,ltrim(string1):去字串左空格。rtrim(string1):去字串右空格
repeat(string1,int1):返回重複string1字串int1次後的字串
reverse(string1):返回string1反轉後的字串。如reverse('abc')返回'cba'
rpad(string1,len1,pad1):以pad1字元右填充string1字串,至len1長度。如rpad('abc',5,'1')返回'abc11'。lpad():左填充
split(string1,pat1):以pat1正則分隔字串string1,返回陣列。如split('a,b,c',',')返回["a","b","c"]
substr(string1,index1,int1):以index位置起擷取int1個字元。如substr('abcde',1,2)返回'ab'
聚合函式

count():統計行數
sum(col1):統計指定列和
avg(col1):統計指定列平均值
min(col1):返回指定列最小值
max(col1):返回指定列最大值
表生成函式
與聚合函式相反,將欄位內複雜的資料拆分成多行。

explode (array):返回多行array中對應的元素。如explode(array('A','B','C'))返回

explode(map):返回多行map鍵值對對應元素。如explode(map(1,'A',2,'B',3,'C'))返回

explode常用來做行列轉換。

作者的原創文章,轉載須註明出處。原創文章歸作者所有,歡迎轉載,但是保留版權。對於轉載了博主的原創文章,不標註出處的,作者將依法追究版權,請尊重作者的成果。