因爲MaxCompute SQL自己不提供相似數據庫的select * from table limit x offset y的分頁查詢邏輯。可是有不少用戶但願在必定場景下可以使用獲取相似數據庫分頁的邏輯,對查詢結果進行分頁/分批獲取結果,本文將介紹幾種方法,來實現上述場景。html
1. 藉助row_number()函數做爲遞增惟一標識進行過濾查詢java
select * from (select row_number() over() as row_id,* from orders_delta)t where row_id between 10 and 20;數據庫
經過row_number()對數據進行排序及惟一標識編號,而後根據該標識選取每次查詢的分頁範圍。session
2. 利用Java SDK的InstanceTunnel在下載結果時進行分批下載函數
MaxCompute JavaSDK提供了SQLTask + InstanceTunnel直接導出select的數據集的方法,具體能夠參考《使用 Instance Tunnel 獲取 Maxcompute Instance 的執行結果》code
該案例中,提供了經過InstanceTunnel來下載用戶自定義SELECT查詢的方法。htm
Odps odps = OdpsUtils.newDefaultOdps(); // 初始化 Odps 對象 Instance i = SQLTask.run(odps, "select * from wc_in;"); i.waitForSuccess(); // 建立 InstanceTunnel InstanceTunnel tunnel = new InstanceTunnel(odps); // 根據 instance id,建立 DownloadSession InstanceTunnel.DownloadSession session = tunnel.createDownloadSession(odps.getDefaultProject(), i.getId()); long count = session.getRecordCount(); // 輸出結果條數 System.out.println(count); // 獲取數據的寫法與 TableTunnel 同樣 TunnelRecordReader reader = session. openRecordReader (0, count); Record record; while ((record = reader.read()) != null) { for (int col = 0; col < session.getSchema().getColumns().size(); ++col) { // wc_in 表字段均爲 STRING, 這裏就直接打印輸出 System.out.println(record.get(col)); } } reader.close();
這裏經過了SQLTask提交了1條自定義select查詢,而後使用InstanceTunnel.DownloadSession直接對該查詢結果進行下載。其中,openRecordReader方法支持指定本次讀取記錄的起始位置和讀取數量,經過openRecordReader(start,long)的參數設定,可實現分批下載的邏輯。對象
例如,將上面例子中openRecordReader (0, count)修改成用戶想獲取的起始位置和獲取記錄數量:blog
TunnelRecordReader reader = downloadSession.openRecordReader(100, 20);
參考內容:MaxCompute SDK Java Doc的InstanceTunnel.DownloadSession類的openRecordReader方法。排序
因爲MaxCompute所處理表的數據量每每都很是大,以上的方法通常不建議使用在報表的交互分頁查詢場景上。對於交互時查詢有需求的用戶,能夠考慮經過MaxCompute的交互式分析(Lightning)來查詢。
3. 利用MaxCompute交互式分析(Lightning)的limit/offset語法實現分頁
MaxComput SQL不支持limit/offset語法,但開發者能夠藉助MaxCompute交互式分析(Lightning)來使用limit/offset。
MaxCompute交互式分析可以在相同的權限體系下,以PostgreSQL協議和語法快速查詢MaxCompute數據。利用PostgreSQL的limit offset語法能夠實現與數據庫查詢相同的分頁效果。
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。