阿里云MaxCompute(ODPS)如何使用SQL同步数据(SQLTask模式)-程序员宅基地

技术标签: MaxCompute  临时表  # └ ODPS(MaxCompute)  TableTunnel  sqlTask  ODPS  大数据  

ODPS默认都是通过TableTunnel来获取数据,支持分区、续传等。但TableTunnel只支持单表,有时需要联表过滤数据就不能支持了。

官方提供了SQLTask模式来进行一些扩展。

思路

ODPS提供了两种方式来执行SQL:

  1. 直接使用SQLTask查询数据,但每次不支持超过10000行;

    未尝试能否通过多次执行task、每次task限定分页条件实现获取全部数据

  2. 通过SQLTask创建临时表,通过TableTunnel同步临时表;

推荐第二种方案,实现成本低、可维护性好、性能优秀。

示例代码

最低成本的代码改造思路:

  • 创建com.aliyun.odps.tunnel.TableTunnel通道,使用其createDownloadSession(String projectName, String tableName)方法下载表
    • 该步逻辑与一般通过TableTunnel下载单表相同
  • 调用上述方法时,传入的tableName不再是单表名,而是创建的临时表名
private String getRealName() {
    
        String table = generateTempName(), sql = "查询语句";
        StringBuilder create = new StringBuilder("CREATE TABLE ").append(table).append(" LIFECYCLE 1 AS ").append(sql);
        
		// SQLTask的sql,要求以;结尾,否则会报错
        if (!sql.endsWith(";")) {
    
            create.append(";");
        }
        Instance i;
        try {
    
        	// 创建临时表
            i = SQLTask.run(odps, create.toString());
            i.waitForSuccess();
        } catch (OdpsException e) {
    
            throw new RuntimeException("Error to execute odps sql task", e);
        }
        return table;
    }

private String generateTempName() {
    
		// 只支持英文字母、数字、下划线
        return new StringBuilder(64).append("temp_task_").append("按自定规则生成的序列号").toString();
    }

注意:

  • SQL需以;结尾,否则报错
  • 临时表明只支持英文字母、数字、下划线,否则报错

总结

上面用最快速的方式,在尽可能不侵入原有逻辑的方式下,实现了用SQL同步数据。
但这个方式有个比较大的问题,就是不支持分区,这样跨分区查询数据、大量数据的下载会比较耗时。不过可以在创建临时表、查询SQL中增加分区逻辑,但需要更多开发成本。

参考资料

  • https://help.aliyun.com/document_detail/120601.html?spm=a2c4g.11186623.6.973.65b14317QHBhfL
  • https://help.aliyun.com/document_detail/73768.html?spm=5176.11065259.1996646101.searchclickresult.69714e9cDvq9mv

以上。感谢您的阅读。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zgdwxp/article/details/101772965

智能推荐

windows下安装PHP的扩展xhprof_windows php 怎么安装 proc 扩展-程序员宅基地

文章浏览阅读2.2k次。1.下载扩展:windows:http://windows.php.net/downloads/pecl/releases/xhprof/0.10.6/Linux:https://github.com/phacility/xhprof 或http://pecl.php.net/package/xhprof【下载最新版 网上分享的旧版有BUG (后面说)】注意:_windows php 怎么安装 proc 扩展

mysql text保存图片_MySQL存储文本和图片的方法-程序员宅基地

文章浏览阅读1.5k次。Oracle中大文本数据类型Clob 长文本类型 (MySQL中不支持,使用的是text)Blob 二进制类型MySQL数据库Text 长文本类型TINYTEXT: 256 bytesTEXT: 65,535 bytes => ~64kbMEDIUMTEXT: 16,777,215 bytes => ~16MBLONGTEXT: 4,294,967,..._mysql test类型保存图片

纯前端使用xlsx-js-style实现带样式表格导出_xlsx-style 下载-程序员宅基地

文章浏览阅读805次,点赞3次,收藏2次。最近接到一个新的需求是纯前端导出并且携带样式,也踩过了许多的坑1.xlsx开源版只能实现导出不能携带样式2.xlsx-style可以实现样式,但是弊端是:步骤麻烦、添加多Sheet页也麻烦3.xlsx-js-style结合xlsx和xlsx-js的免费插件,步骤简单,可实现纯前端带样式和多Sheet页导出。_xlsx-style 下载

Spark学习之driver_spark driver什么时候创建-程序员宅基地

文章浏览阅读9.5k次,点赞13次,收藏47次。driver在spark中并不是一个非常重要的概念,但是在学习过程中对于他的理解感觉比其他组件都要费劲,花了几天的功夫终于把Driver弄明白了,希望这篇博客能对刚学习spark的人有点帮助因为driver这个概念的理解与spark的运行模式有关,所以在讲解spark之前会先讲一下spark的四种分布式运行模式spark的四种分布式运行模式 如图所示,上方为spark的架构图,s_spark driver什么时候创建

编写REST风格接口的注意点_平时写的接口是不是rest风格-程序员宅基地

文章浏览阅读1.9k次。https://blog.csdn.net/houjixin/article/details/54315835就看这篇文章等待过两天总结。写了大概半年的restful接口,但是没有注意其中的注意点。多注意这些细节,你才能进步。..._平时写的接口是不是rest风格

Tomcat 七 HTTP 连接器-程序员宅基地

文章浏览阅读179次。摘要本文尝试翻译Tomcat官方文档Apache Tomcat 7连接器,不足之处敬请指正。该文先介绍了Tomcat7 HTTP连接器的属性,包括:公共属性、标准实现、Java TCP套接字属性、BIO的具体配置、NIO的具体配置、APR/Native的具体配置。接着介绍了Tomcat的特殊功能,包括:HTTP/1.1和HTTP/1.0的支持、代理支持、SSL支持以及连接器的比较。..._tomcat http 连接器

随便推点

linux文件系统查看目录,Linux文件系统目录结构-程序员宅基地

文章浏览阅读284次。8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?本文以CentOS系统为例,但同样适用于Linux的其他发行版。不需要纠结于具体的版本,了解设计意图即可。本文随时更新。除勘误外,不另做批注。圆型节点代指目录,方型节点代指文件。图中省去了很多不常用的目录与文件。稍后单独讲/proc目录与/var目录。Linux将整个文件系统看做一棵树,这棵树的树根叫做根文件系统,用”/..._查看/user/root/txtdir目录结构

将华氏温度转换成摄氏温度_android studio怎么将华氏温度转换为摄氏度-程序员宅基地

文章浏览阅读3.4k次。写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32其中C表示摄氏温度,F表示华氏温度。程序的输入是一个整数,表示华氏温度。输出对应的摄氏温度,也是一个整数。提示,为了把计算结果的浮点数转换成整数,需要使用下面的表达式: (int)x;其中x是要转换的那个浮点数。输入格式:_android studio怎么将华氏温度转换为摄氏度

串行通信/并行通信和UART、SPI、I2C、USB以及TTL、CMOS、RS-232、RS-485区别详细整理_串口与usb,spi通信有啥区别-程序员宅基地

文章浏览阅读1.8w次,点赞23次,收藏222次。串行通信/并行通信和UART、SPI、I2C、USB以及TTL、RS-232、RS-485区别详细整理串行通信/并行通信和UART口/USB口以及TTL、RS-232、RS-485这些和通信相关的名词我们做电子的每天都在接触,但是如果不认真整理,我想很多人都不知道这些名词的具体含义和区别,因为我项目中刚好需要用到UART传输数据,所以就打算用这篇文章好好的归纳一下这些磨人的“通信名词”关于串行..._串口与usb,spi通信有啥区别

【记录】easyexcel导出后打开文件报已损坏_导出exel,本地好使,服务器显示文件损坏-程序员宅基地

文章浏览阅读6.2k次。本地导出excel没问题,在linux服务器导出的excel文件是损坏的。1、导出数据可能是空的。2、linux 下可能没有权限创建临时文件,赋权限chmod 777 就可以了_导出exel,本地好使,服务器显示文件损坏

mac上mysql5.6.42 开启报错 ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)_mysql error!couldn-程序员宅基地

文章浏览阅读5.9w次,点赞6次,收藏12次。 1,突发奇想在 Mac上安装一发mysql 玩一玩 突然启动的时候报错 顿时疯狂找度娘 结果找来找去 也耽搁时间 最后还是在一篇博客找到了2.mysql 的安装见 https://blog.csdn.net/dongdong9223/article/details/80722654 博客捎带提一嘴 这个安装 总体来讲没多大难度 可是当我在mysql目录下启动时候 sudo ..._mysql error!couldn

openssl x509 证书命令-程序员宅基地

文章浏览阅读810次。openssl x509命令具以下的一些功能,例如输出证书信息,签署证书请求文件、生成自签名证书、转换证书格式等。openssl x509工具不会使用openssl配置文件中的设定,而是完全需要自行设定或者使用该伪命令的默认值,它就像是一个完整的小型的CA工具箱。#主要选项:-in filename : #指定证书输入文件,若同时指定了"-req"选项,则表示输入文件为证书请求文件。-out filename : #指定输出文件-...

推荐文章

热门文章

相关标签