第九弹 - 脚本模式与参数视图

MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务。 MaxCompute除了持续优化性能外,也致力于提升SQL语言的用户体验和表达能力,提高广大ODPS开发者的生产力。

MaxCompute基于ODPS2.0新一代的SQL引擎,显著提升了SQL语言编译过程的易用性与语言的表达能力。我们在此推出MaxCompute(ODPS2.0)重装上阵系列文章

第一弹 - 善用MaxCompute编译器的错误和警告
第二弹 - 新的基本数据类型与内建函数
第三弹 - 复杂类型
第四弹 - CTE,VALUES,SEMIJOIN
第五弹 - SELECT TRANSFORM
第六弹 - User Defined Type
第七弹 - Grouping Set, Cube and Rollup
第八弹 - 动态类型函数

第八弹中提到了参数化视图,本篇就向您介绍MaxCompute 脚本模式和参数化视图。

  • 场景1
    项目有个业务处理逻辑很复杂,需要读多个表,某些表之间需要join,得出结果后再join,且要从不同的运算阶段输出多个表,即使用CTE也无法表达,只好将此业务逻辑拆分为多个作业,按顺序提交,如此一来使得作业又复杂性能也不好。
  • 场景2
    当前Project有个数据表需要分享给多个团队使用,考虑安全性做成了视图, 视图是通过一个算法模式实现。其他团队发现此算法挺好也想用,但是底层访问的数据表不一样,一些模式识别的参数也不一样,没办法只好再做一个新的视图提供。若后续发现原来的视图有bug,那么只能一个个的修复。

MaxCompute 提供的脚本模式与参数化视图,基本解决了上述场景中的问题。

脚本模式

此文中采用MaxCompute Studio作展示,首先,安装MaxCompute Studio,导入测试MaxCompute项目,创建工程,建立一个新的MaxCompute脚本文件, 如下

image.png

注意,要选取MaxCompute Studio的脚本模式。这样编译器就会将整个文件作为一个整体编译,而不是一个一个语句的编译,提交的时候,也是整体提交。

观察此脚本,可以看到其从多个表src, src1, src2读取数据,中间可以做任意的filter, union, join等操作,最后输出到多个表,dest和dest1中。多个语句以@开始的表变量连接。编译后提交脚本运行,可以通过MaxCompute Studio的作业试图察看执行计划,如下:

image.png

右键点击图中任意task,弹出菜单点击“expand all”,可以在一个视图中看到执行计划所有operator及其相互关系,如下:

image.png

可以看到虽然有多个语句,但是执行计划是互相连通的一个DAG。这样的执行计划,用传统的SQL语句,不管是CTE还是multi INSERT,都无法生成。一个执行计划可以保证一次排队,一次执行,充分利用了MaxCompute的资源。且书写起来也更自然,只需要按照业务逻辑,用类似于普通编程语言的方式书写,不用分心考虑如何组织语句,比如使用CTE和MULTI INSERT等,来优化性能。

同时,MaxCompute的优化器,比起多个语句分别执行,在脚本模式下能够看到更完整的执行计划,也就可以有更多的优化机会,生成全局最优的物理执行计划,提高性能。

脚本模式也支持SET语句和部分DDL语句。例如:

image.png

一个脚本的完整形式是先SET语句,然后DDL语句,最后DML语句。每个部分都可以有0到多个语句,但是不同类型的语句不能交错。

需要注意的是,在脚本模式下,如果一个表先被写,又被读,会报告错误,避免混淆。例如以下语句会报错

insert overwrite table src2 select * from src where key > 0;
@a := select * from src2;
select * from @a;

建议您在书写的时候,避免先写后读,例如以上脚本可以修改为:

@a := select * from src where key > 0;
insert overwrite table src2 select * from @a;
select * from @a;

这样就可以打印出会写入src2中的内容了。

脚本模式下目前还有一些限制

  • 一个脚本,目前最多支持一个屏显语句,否则会报告错误。不建议在脚本中执行屏幕显示的SELECT语句。
  • 一个脚本,目前最多支持一个CREATE TABLE AS语句并且必须是最后一句。我们推荐您将建表语句与INSERT语句分开写,如上面提到的DDL和DML混合的脚本。

通过MaxCompute CMD使用脚本模式

脚本模式是一种新的模式,如果使用MaxCompute CMD来提交脚本,需要使用0.27以上的版本。建议您下载安装最新版本。安装后,请使用新的 -s 参数来提交 。

如编辑脚本模式的源码myscript.sql文件,调用odpscmd命令执行如下。

odpscmd -s myscript.mysql;

说明 -s 为odpscmd的命令行选项,类似于-f、-e,而非交互环境中的命令。odpscmd的交互环境中暂不支持脚本模式与表变量。

如果希望传递一些setting,但是又不想写在脚本里面,可以按照如下的方,使用-e参数来单独传递setting

odpscmd -e 'set odps.sql.setting1=a;odps.sql.setting2=b='-s myscript.sql

通过DataWorks使用脚本模式

在DataWorks中可以建立脚本模式的节点ODPS Script,如下图所示。

image.png

在此节点中进行脚本模式编辑,编辑完成后单击工具栏的运行按钮,提交脚本到MaxCompute执行。从输出信息的Logview URL中可以查看执行计划图和结果。

什么时候不应将多个小SQL语句组合为一个大模式脚本SQL

脚本模式能够支持复杂的逻辑,一个脚本可以有很多行,编译为一个执行计划,这样很容易将原来在多个SQL节点中的语句通过table variable衔接起来,拼装为一个大的脚本模式SQL。但是,并不是所有场景都适合。

例如,如果上游数据来源于两个每日更新的表,一个凌晨1点数据准备好,一个凌晨7点准备好,原来一个SQL节点1点的时候处理第一个数据,结果存为一个中间表。另一个SQL节点在7点的时候将此中间表和第二个数据源作进一步运算得到结果数据。这种场景就不适合将两个节点中的SQL组合为一个大脚本。因为一个SQL节点本来可以更早的做好数据预处理,如果合成一个大脚本,就只能在7点所有数据都到达后生成一个作业,本来可以预处理的也要在大作业中完成,反而造成全链路E2E时间更长,出错的概率也更高。

脚本模式更适合用来改写本来要用层层嵌套子查询的单个语句,或者因为脚本复杂性而不得不拆成多个语句的脚本。

参数化的视图 (VIEW)

MaxCompute传统的VIEW,可以封装一段SQL脚本,底层的逻辑可以很复杂,比如访问多个表,做复杂的运算,但是调用者可以像读普通表一样调用VIEW,不关心底层实现。这样的VIEW实现了一定的封装与重用,使用非常广泛。

但是传统的VIEW也有一个限制,就是不能接受任何调用者传递的参数。例如某个VIEW读取一个底层表,希望调用者可以提供一个表对底层数据进行过滤,或者传递任何其他参数,这些需求传统VIEW都不支持。如此便限制了传统VIEW在代码重用方面的能力,而开发中仍经常需要多次复制类似的代码。

MaxCompute支持带参数的VIEW,可以传入任意表或者其他变量,定制VIEW的行为。

首先在MaxCompute建立一个新的MaxCompute脚本文件, 如下:

image.png

可以看到,pv有两个参数,一个是表参数,一个是string参数,参数可以是任意的表或者基本类型。创建另一个脚本调用此VIEW,如下:

image.png

可以看到pv1可以用不同的参数调用,表参数可以是个物理表,view,表变量或者CTE中的表别名,普通参数可以是变量或者常量。

点击此脚本的graph页 (上图中最下边的红框),可以看到此脚本对应的执行计划:

image.png

可以看到,不管调用多少次,用什么样的参数,MaxCompute编译器都会将整个脚本编译为一个执行计划。

实际上,参数化VIEW不一定是一个SQL语句,也可以像脚本一样,包含多个语句。例如:

image.png

其中BEGIN到END;之间的语句,就是这个VIEW的脚本。注意其中最后一句,@pv2 := ...,这个语句相当于是其他语言中的RETURN语句,方式为向一个与VIEW同名的隐含的表变量赋值。

在VIEW参数匹配的时候,实参和形参匹配的规则和普通语言一样。如果可以隐式转换,就可以匹配,例如bigint的值可以匹配类型为double的参数。表变量相对复杂一些,但是规则也很简单,如果一个表的Schema,能够用来插入到另一个表中,那也可以用来匹配同样表Schema的表类型参数。

对于返回的类型,有的时候希望明确声明,例如为了可读性。可以明确地声明返回类型,例如:

image.png

其中的RETURNS @ret TABLE (x string, y string), 定义了:

  • 返回类型为TABLE (x string, y string)。也就是返回给调用者的类型,注意可以在此定制表的Schema
  • 返回参数为@ret,在VIEW的脚本中对其赋值,就相当于返回。

实际上,对于没有BEGIN/END和没有返回变量的VIEW,都可以认为是这种形式的简化形式。

在参数化VIEW的时候,对于脚本有一些其他限制。

  • 脚本中只能由DML语句,并且不能有INSERT与CREATE TABLE AS语句。
  • 脚本中不能有屏幕显示语句。

最后,MaxCompute提供了新的脚本模式与参数化视图,可以明显提高开发者的编程效率,提高代码的可重用性,与此同时,也提高了性能!我们推荐您尽量使用脚本模式和参数化视图。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3---安装Element-Plus组件库

*** 全局安装Element-Plus 1. npm安装 npm install element-plus --save 2. 在main.js中引入以下内容 import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css import App from ./App.vue const app createApp(App…

在家“隔离”这1个月,阿里云视频云这些工程师都经历了什么?

战"疫”当前,没有谁会置身事外。从1月底开始,一场全民疫情阻击战拉开帷幕,企业停工、学校停课、商场停业,城市街道分外冷清,相反的是,无法出门的数亿网民却在互联网上掀起了一阵不小的流量热潮。距离2…

CSDN的常用文本设置(字体大小红色)

<font face"黑体" color#FF0000 size4> **在这里放入需要修改颜色的语句**</font>在这里放入需要修改颜色的语句

让安全威胁无所遁形,全方位掌握攻击“前世今生”的黑科技来了

作者 | 伍杏玲出品 | CSDN&#xff08;ID:CSDNnews&#xff09;据启明星辰发布的《2019~2020网络安全态势观察报告》显示&#xff0c;在过去一年多时间里&#xff0c;勒索攻击由 2014 年的广泛无目的的传播阶段到2017 年 WannaCry 带来的大规模自动化传播阶段&#xff0c;如今已…

Vue3---vue组件库

1.vue-form-making 基于 vue 和 element-ui 实现的表单设计器&#xff0c;使用了最新的前端技术栈&#xff0c;内置了 i18n 国际化解决方案&#xff0c;可以让表单开发简单而高效。 项目地址&#xff1a;https://gitee.com/gavinzhulei/vue-form-making 2.viewUI ViewUI 是…

docker mysql 日志在哪里_docker容器启动后日志在哪里

docker容器启动后日志在哪里&#xff1f; docker启动后日志会在以下位置 /var/lib/docker/containers/容器ID/容器ID-json.log 也可以使用以下命令查看日志&#xff1a; docker logs 容器ID使用docker-compose可以通过配置把日志记录到本地文件中 实战&#xff0c;演示以mys…

数据价值挖掘利器!阿里云实时数仓AnalyticDB PG

目的 随着数字经济时代的到来&#xff0c;越来越多的应用依赖数据分析来挖掘数据的价值。作为大数据存储、在线分析的重要基础系统&#xff0c;分析型数据库&#xff08;OLAP&#xff09;为数据价值的在线化提供重要的技术平台。 阿里巴巴OLAP团队经过调研发现&#xff0c;现…

美国AI博士指出:60天掌握Python全栈需要...

我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0…

别琢磨了,企业高效灵活运作的秘密拿走:企业邮箱5折起!分享会场抽取苹果手机和猫超卡!

办了公司没个官方邮箱怎么行&#xff1f;还在用私人邮箱联系业务吗&#xff1f; - 不专业&#xff01; 业务多了维护客户人脉关系怎么整&#xff1f;还在靠数名片管客户&#xff1f;- 太费劲&#xff01; 公司大了管理维护难&#xff1f;还指望能靠人力运营&#x…

Vue3---安装axios

1. 安装axios npm install axios 2.配合vue-axios使用 npm install vue-axios --save 3.在main.js中引入 import axios from axios; import VueAxios from vue-axios 4. 注册使用 createApp(App).use(VueAxios,axios).mount(#app)

docker 配置nginx镜像出现 403 Forbidden的问题

&#xff08;1&#xff09;docker 配置nginx镜像的时候&#xff0c;将映射文件配置到当前宿主机上,启动nginx镜像&#xff0c;&#xff0c;通过域名访问&#xff0c;出现 403 查看nginx error.log日志&#xff0c;发现出现 &#xff08;2&#xff09;nginx镜像文件的配置: 启…

一套 SQL 搞定数据仓库?Flink有了新尝试

数据仓库是公司数据发展到一定规模后必然需要提供的一种基础服务&#xff0c;也是“数据智能”建设的基础环节。迅速获取数据反馈不仅有利于改善产品及用户体验&#xff0c;更有利于公司的科学决策&#xff0c;因此获取数据的实时性尤为重要。 目前企业的数仓建设大多是离线一套…

17 年安全界老兵,专注打造容器安全能行吗?

作者 | 伍杏玲出品 | CSDN&#xff08;ID:CSDNnews&#xff09;容器作为云原生的代表技术&#xff0c;很多人认为是容器技术掀起云原生的变革&#xff1a;2004 年&#xff0c;谷歌开始使用容器技术&#xff0c;并在2006年发布进程容器&#xff0c;将容器虚拟化基础设施引入 Lin…

“开源”vs“商业”,差别到底有多大?这篇测试一目了然

近些年来在数据分析领域&#xff0c;涌现出很多开源的技术方案&#xff0c;例如Presto、Spark、Impala等。面对多种选择&#xff0c;客户往往会比较困惑、无从下手。此外&#xff0c;MySQL生态非常火热&#xff0c;但对于数据分析类场景&#xff0c;使用此类关系型数据库是否合…

docker: Error response from daemon: driver failed programming external connectivity

docker: Error response from daemon: driver failed programming external connectivity 解决方案 &#xff08;重新启动docker&#xff09; systemctl restart docker

Vue3项目 --- Mock.js模拟数据测试

1. npm 安装Mock.js npm install mockjs 2. Main.js中引入Mock import Mock from mockjs require(./mock) createApp(App).use(Mock).mount(#app) 3. 在src目录下新建一个 mock目录并创建index.js文件&#xff0c;用来配置mock // 配置 mock 文件 // 首先引入Mock const Mo…

该买哪家二手手机呢?程序员爬取京东告诉你!

作者 | AJ Gordon责编 | 李雪敬出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;当你手头有一件闲置的物品时&#xff0c;最好的办法不是放在家里积灰&#xff0c;而是拿到二手网站上进行拍卖&#xff0c;例如淘宝的闲鱼&#xff0c;京东的拍拍等等。有这方面经验的…

docker启动elasticsearch——ERROR: Elasticsearch did not exit normally - check the logs at xxx

报错信息&#xff1a; ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/docker-cluster.log解决办法&#xff1a; 在运行命令中添加 -e “discovery.typesingle-node” docker run \ -d \ --name es-temp \ -e "discove…

阿里十年DBA经验产品经理:真的不要再有一起删库跑路事件了

最近网上又出一起删库跑路事件&#xff0c;本不想过多写此类事件文字&#xff0c;但从业13年&#xff0c;十年DBA工作经验&#xff0c;职业素养还是驱使自己写点内容&#xff0c;以期能够帮助广大企业客户。 本文主要以数据库产品从业者角度&#xff0c;介绍帮助企业减少意外或…

docker kibana nable to retrieve version information from Elasticsearch nodes. getaddrinfo

docker nable to retrieve version information from Elasticsearch nodes. getaddrinfo* 分析&#xff1a; kibana 连接不到Elasticsearch 节点 kibana6.8.10 连接 Elasticsearch6.8.10版本使用"ELASTICSEARCH_URLhttp://192.168.92.129:9200" kibana7.14.2 连接…