因为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语法能够实现与数据库查询相同的分页效果。
原文连接 本文为云栖社区原创内容,未经容许不得转载。