在SparkSQL實踐中,取出滿足指定條件的數據並顯示,如果因為數據太多,必須要有分頁功能,一開始,想到的是select top N的方式,但測試過后,SparkSQL中並不支持這種語法,查了SparkSQL的幫助,spark支持類似mysql的limit語法,如下例所示,limit表示取出滿足條件的前N條記錄:
val df = spark.sql("select a, b from tb1 where a>100 limit 10")
但limit僅僅實現了非常簡單的類似top N的功能,還不能很好的查找某個區間范圍的記錄,比如分頁顯示,那還有什么其它方法嗎?
當然,還有更好的方法,在SparkSQL中,有一項更好的功能,row_number,這是一個窗口函數(window function),從spark1.5版本引入,語法格式為:
row_number() over (partition by 'xx' order by 'yy' desc) rank
具體含義為:根據表中字段進行分組(partition by),然后根據表中的字段排序(order by),對於每個分組,給每條記錄添加一個從1開始的行號
如果不使用partition by語句,則表示對整個dataframe表添加行號
對此行號做分頁查詢,下面是一個例子:
val df3 = spark.sql("select Cusip, SecurityType, Share, rank from (select *,row_number() over (order by Date , AccountNumber desc) as rank from holding where Month = \"2000-06\") temp
where 3 < rank and rank <= 9")
在上面sql中,取出的是滿足rank在某個區間的記錄,