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

通过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语法可以实现与数据库查询相同的分页效果。


本文作者:圣远

原文链接

本文为云栖社区原创内容,未经允许不得转载。

MaxCompute如何对SQL查询结果实现分页获取的更多相关文章

  1. 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期

    腾讯云图片鉴黄集成到C#   官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...

  2. ASP .NET 如何在 SQL 查询层面实现分页

    [编者按]本文作者为来自巴基斯坦的软件开发工程师 Aqeeel,主要介绍了在 SQL 查询层面实现 ASP.NET 应用的分页方法. 本文系 OneAPM 工程师编译呈现,以下为正文. GridVie ...

  3. SQL Server 怎么在分页获取数据的同时获取到总记录数

    SQL Server 获取数据的总记录数,有两种方式: 1.先分页获取数据,然后再查询一遍数据库获取到总数量 2.使用count(1) over()获取总记录数量 SELECT * FROM ( SE ...

  4. Hibernate-原生SQL查询

    HQL尽管容易使用,但是在一些复杂的数据操作上功能有限.特别是在实现复杂的报表统计与计算,以及多表连接查询上往往无能为力,这时可以使用SQL(Native SQL)实现HQL无法完成的任务. 1.使用 ...

  5. sql查询语句如何解析成分页查询?

    我们公司主要mysql存储数据,因此也封装了比较好用mysql通用方法,然后,我们做大量接口,在处理分页查询接口,没有很好分查询方法.sql查询 语句如何解析成“分页查询”和“总统计”两条语句.可能, ...

  6. SpringData JPA进阶查询—JPQL/原生SQL查询、分页处理、部分字段映射查询

    上一篇介绍了入门基础篇SpringDataJPA访问数据库.本篇介绍SpringDataJPA进一步的定制化查询,使用JPQL或者SQL进行查询.部分字段映射.分页等.本文尽量以简单的建模与代码进行展 ...

  7. EF core的原生SQL查询以及用EF core进行分页查询遇到的问题

    在用.net core进行数据库访问,需要处理一些比较复杂的查询,就不得不用原生的SQL查询了,然而EF Core 和EF6 的原生sql查询存在很大的差异. 在EF6中我们用SqlQuery和Exe ...

  8. springDataJPQL实现增删改查及分页,原生sql查询,根据方法命名规则实现查询以及Specification查询

    一.使用方法 1.在dao中定义开一个方法,使用方法的参数设置jpql,并且使用方法的返回值接受查询结果,在方法上添加@query注解,在注解中写jpql语句进行增删改查,测试 2.使用原生的sql语 ...

  9. SpringDataJpa使用原生sql(EntityManager)动态拼接,分页查询

    SpringDataJpa Spring Data JPA是较大的Spring Data系列的一部分,可轻松实现基于JPA的存储库.该模块处理对基于JPA的数据访问层的增强支持.它使构建使用数据访问技 ...

随机推荐

  1. mavenjar 一些拉取不下来问题

    http://search.maven.org/这里找相近版本替换试试.拉取不下来是因为官方版本不足或者网络问题.

  2. [Array]485. Max Consecutive Ones

    Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ...

  3. Win7+AMD+VS2013+opencl1.x安装与测试

    参考资料:http://www.cnblogs.com/lihao602/archive/2013/05/08/3067239.html: http://blog.csdn.net/zhoubo616 ...

  4. bzoj 3029 守卫者的挑战——概率期望dp+状态数思考

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3029 先随便写了个dfs,记录“前 i 次.成功 j 次.容量-残片=k”的概率.因为是否可 ...

  5. IoT: 物联网安全测试经验总结

    前言 今年早些时候,我参与了许多关于物联网解决方案的安全测试.主要目标是找出体系结构和解决方案中的漏洞.在这篇文章中,我将讨论一些与物联网解决方案的问题和挑战. 什么是物联网? 在你学习有关IPv6的 ...

  6. 2019阿里云开年Hi购季基础云产品分会场全攻略!

    2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...

  7. 二维vector基本使用

    变量声明 vector<vector<int> > 变量名: 添加行 vector<vector<int> > v2d; for(int i=0;i&l ...

  8. 【python之路16】作业

    #!usr/bin/env python # -*- coding:utf-8 -*- # 数据库中原有 old_dict = { "#1": {'hostname': 'c1', ...

  9. Mac下升级node到最新版本

    建议先装n,再用n把node升级到最新稳定版: $ npm install -g n $ n stable

  10. 对于MD5加密处理方式

    来源:http://blog.51cto.com/xqtesting/1924977 但有时候我们请求的参数可能需要加密,比如登录接口中的密码可能需要经过md5加密这时候怎么处理呢? 这种方法比较简单 ...