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常用來做行列轉換。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM