MaxCompute如何对SQL查询结果实现分页获取

简介:  由于MaxCompute SQL本身不提供类似数据库的select * from table limit x offset y的分页查询逻辑。但是有很多用户希望在一定场景下能够使用获取类似数据库分页的逻辑,对查询结果进行分页/分批获取结果,本文将介绍几种方法,来实现上述场景。

 由于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 where row_id between 10 and 20;


0d3343282971cea850d27a944e45734e1ad30b1f

通过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)的参数设定,可实现分批下载的逻辑。

4e92a52ff30d899dde41345ed1d484fae7be0d65

例如,将上面例子中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语法可以实现与数据库查询相同的分页效果。

7cfe96c17dd9b3f4e85f438eaa29138feb812324

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
10天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
13 0
sql语句加正则 简化查询
|
28天前
|
SQL
sql server链接查询
sql server链接查询
17 1
|
28天前
|
SQL
sql server简单查询
sql server简单查询
14 1
|
1月前
|
Java 关系型数据库 数据库连接
MyBatis Plus 解决大数据量查询慢问题
MyBatis Plus 解决大数据量查询慢问题
|
17天前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
13 0
|
28天前
|
SQL
sql高级查询
sql高级查询
12 0
|
1月前
|
SQL 存储 数据可视化
10个高级的 SQL 查询技巧
10个高级的 SQL 查询技巧
|
29天前
|
SQL 数据库
sql server高级查询,看这篇文章就够了
sql server高级查询,看这篇文章就够了
21 0
|
1月前
|
SQL
T-SQL 语句查询
T-SQL 语句查询
55 0
|
1月前
|
SQL 存储 关系型数据库
sql数据库查询语句大全
sql数据库查询语句大全

相关产品

  • 云原生大数据计算服务 MaxCompute