MaxCompute如何對SQL查詢結果實現分頁獲取

芊寶寶發表於2019-04-16

由於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;

MaxCompute如何對SQL查詢結果實現分頁獲取

通過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)的引數設定,可實現分批下載的邏輯。

MaxCompute如何對SQL查詢結果實現分頁獲取

例如,將上面例子中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語法可以實現與資料庫查詢相同的分頁效果。

MaxCompute如何對SQL查詢結果實現分頁獲取


原文連結

本文為雲棲社群原創內容,未經允許不得轉載。


相關文章