ODPS默认都是通过TableTunnel来获取数据,支持分区、续传等。但TableTunnel只支持单表,有时需要联表过滤数据就不能支持了。
官方提供了SQLTask模式来进行一些扩展。
思路
ODPS提供了两种方式来执行SQL:
- 直接使用SQLTask查询数据,但每次不支持超过10000行;
未尝试能否通过多次执行task、每次task限定分页条件实现获取全部数据
- 通过SQLTask创建临时表,通过TableTunnel同步临时表;
推荐第二种方案,实现成本低、可维护性好、性能优秀。
示例代码
最低成本的代码改造思路:
- 创建
com.aliyun.odps.tunnel.TableTunnel
通道,使用其createDownloadSession(String projectName, String tableName)
方法下载表- 该步逻辑与一般通过
TableTunnel
下载单表相同
- 该步逻辑与一般通过
- 调用上述方法时,传入的
tableName
不再是单表名,而是创建的临时表名
private String getRealName() {
String table = generateTempName(), sql =