由於MaxCompute SQL本身不提供類似資料庫的select * from table limit x offset y的分頁查詢邏輯。但是有很多使用者希望在一定場景下能夠使用獲取類似資料庫分頁的邏輯,對查詢結果進行分頁/分批獲取結果,本文將介紹幾種方法,來實現上述場景。
1. 藉助row_number()函式作為遞增唯一標識進行過濾查詢
select * from (select row_number() over() as row_id,* from orders_delta)t whererow_id between 10 and 20;
通過row_number()對資料進行排序及唯一標識編號,然後根據該標識選取每次查詢的分頁範圍。
2. 利用Java SDK的InstanceTunnel在下載結果時進行分批下載
MaxCompute JavaSDK提供了SQLTask + InstanceTunnel直接匯出select的資料集的方法,具體可以參考《使用 Instance Tunnel 獲取 Maxcompute Instance 的執行結果》
該案例中,提供了通過InstanceTunnel來下載使用者自定義SELECT查詢的方法。
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)修改為使用者想獲取的起始位置和獲取記錄數量:
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語法可以實現與資料庫查詢相同的分頁效果。
本文為雲棲社群原創內容,未經允許不得轉載。