原题目:马克斯Compute重装参加竞技 第五弹 – SELECT TRANSFO奥德赛

摘要: 马克斯Compute(原ODPS)是Ali云自己作主研究开发的具备产业界超越水平的布满式大数量管理平台,
特别在公司内部得到普及应用,支撑了四个BU的主干职业。
马克斯Compute除了不停优化品质外,也从事于升高SQL语言的用户体验和表明本事,升高大规模ODPS开辟者的生产力。

UDTF

  • Hive中UDTF编写和使用

摘要:
马克斯Compute(原ODPS)是Ali云自己作主研究开发的富有产业界抢先水平的布满式大数额管理平台,
特别在公司内部获得广泛应用,支撑了八个BU的着力业务。
马克斯Compute除了不停优化质量外,也从事于提高SQL语言的用户体验和表明本领,提升广大ODPS开采者的生产力。

马克斯Compute(原ODPS)是Ali云自己作主研究开发的富有产业界超过水平的分布式大数目管理平台,
更加在公司内部获得广泛应用,支撑了多个BU的主导业务。
马克斯Compute除了无休止优化质量外,也从事于进步SQL语言的用户体验和表达技能,进步广大ODPS开垦者的生产力。

UDAF

  • Hive
    udaf开荒入门和平运动作过程详解
  • Hive通用型自定义聚合函数(UDAF)

马克斯Compute(原ODPS)是Ali云自己作主研究开发的有着产业界抢先水平的布满式大额管理平台,
尤其在公司内部得到广泛应用,支撑了多少个BU的为主业务。
马克斯Compute除了不停优化品质外,也从事于进步SQL语言的用户体验和表明能力,进步大范围ODPS开拓者的生产力。

马克斯Compute基于ODPS2.0新一代的SQL引擎,显然进级了SQL语言编写翻译进程的易用性与语言的表明能力。大家在此推出马克斯Compute(ODPS2.0)重装上战地种类小说

Hive中的TRANSFORM:使用脚本完毕Map/Reduce

转自:
http://www.coder4.com/archives/4052

率先来看一下数据:

hive> select * from test;
OK
1       3
2       2
3       1

一旦,我们要出口每一列的md5值。在眼下的hive中是未曾这一个udf的。

我们看一下Python的代码:

#!/home/tops/bin/python

import sys
import hashlib

for line in sys.stdin:
    line = line.strip()
    arr = line.split()
    md5_arr = []
    for a in arr:
        md5_arr.append(hashlib.md5(a).hexdigest())
    print "\t".join(md5_arr)

在Hive中,使用脚本,首先要将她们投入:

add file /xxxx/test.py

然后,在调用时,使用TRANSFORM语法。

SELECT 
    TRANSFORM (col1, col2) 
    USING './test.py' 
    AS (new1, new2) 
FORM 
    test;

那边,我们运用了AS,内定输出的好些个少个列,分别对应到哪个列名。借使省略那句,则Hive会将第三个tab前的结果作为key,前边其他作为value。

此间有七个小坑:有的时候候,我们结合INSERT
OVE景逸SUVWLANDITE使用上述TRANSFORM,而目的表,其分割副大概不是\t。不过请牢记:TRANSFORM的细分符号,传入、传出脚本的,恒久是\t。不要思考外面其余的划分符号!

聊起底,解释一下MAP、REDUCE。

在部分Hive语句中,大家大概拜望到SELECT MAP (…) USING ‘xx.py’这样的语法。

而是,在Hive中,MAP、REDUCE只可是是TRANSFORM的外号,Hive不保障一定会在map/reduce中调用脚本。看看官方文档是怎么说的:

Formally, MAP ... and REDUCE ... are syntactic transformations of SELECT TRANSFORM ( ... ). In other words, they serve as comments or notes to the reader of the query. BEWARE: Use of these keywords may be dangerous as (e.g.) typing "REDUCE" does not force a reduce phase to occur and typing "MAP" does not force a new map phase!

据此、混用map
reduce语法关键字,以至会孳生混淆,所以建议我们要么都用TRANSFORM吧。

友谊提醒:借使脚本不是Python,而是awk、sed等系统内置命令,能够间接利用,而不用add
file。

假使表中有MAP,AENVISIONRAY等复杂类型,怎么用TRANSFORM生成?

例如:

CREATE TABLE features
(
    id BIGINT,
    norm_features MAP<STRING, FLOAT> 
);

答案是,要在剧本的输出中,对特种字段根据HDFS文件中的格式输出就能够。

例如说,以地点的表结构为例,每行输出应为:

1^Ifeature1^C1.0^Bfeature2^C2.0

其中I是tab键,这是TRANSFORM要求的分割符号。B和^C是Hive存储时MAP类型的KV分割符。

其余,在Hive的TRANSFORM语句的时候,要注意AS中增长项目评释:

SELECT TRANSFORM(stuff)
USING 'script'
AS (thing1 INT, thing2 MAP<STRING, FLOAT>)

马克斯Compute基于ODPS2.0新一代的SQL引擎,分明进步了SQL语言编写翻译进度的易用性与语言的表明技能。大家在此推出马克斯Compute(ODPS2.0)重装参预竞赛体系小说

第一弹 –
善用马克斯Compute编译器的荒唐和警告

Hive中的TRANSFORM:自定义Mapper和Reducer完成Map/Reduce

/**
 * Mapper.
 */
public interface Mapper {
  /**
   * Maps a single row into an intermediate rows.
   * 
   * @param record
   *          input record
   * @param output
   *          collect mapped rows.
   * @throws Exception
   *           on error
   */
  void map(String[] record, Output output) throws Exception;
}

能够将一列拆分为多列

采纳样例:

public class ExecuteMap {

    private static final String FULL_PATH_CLASS = "com.***.dpop.ods.mr.impl.";

    private static final Map<String, Mapper> mappers = new HashMap<String, Mapper>();

    public static void main(String[] args) throws Exception {
        if (args.length < 1) {
            throw new Exception("Process class must be given");
        }

        new GenericMR().map(System.in, System.out,
                getMapper(args[0], Arrays.copyOfRange(args, 1, args.length)));
    }

    private static Mapper getMapper(String parserClass, String[] args)
            throws ClassNotFoundException {
        if (mappers.containsKey(parserClass)) {
            return mappers.get(parserClass);
        }

        Class[] classes = new Class[args.length];
        for (int i = 0; i < classes.length; ++i) {
            classes[i] = String.class;
        }
        try {
            Mapper mapper = (Mapper) Class.forName(FULL_PATH_CLASS + parserClass).getConstructor(classes).newInstance(args);
            mappers.put(parserClass, mapper);
            return mapper;
        } catch (ClassNotFoundException e) {
            throw new ClassNotFoundException("Unknown MapperClass:" + parserClass, e);
        } catch (Exception e) {
            throw new  ClassNotFoundException("Error Constructing processor", e);
        }

    }
}

MR_USING=" USING 'java -Xmx512m -Xms512m -cp ods-mr-1.0.jar:hive-contrib-2.3.33.jar com.***.dpop.ods.mr.api.ExecuteMap "

COMMAND="FROM dw_rtb.event_fact_adx_auction "
COMMAND="${COMMAND} INSERT overwrite TABLE dw_rtb.event_fact_mid_adx_auction_ad PARTITION(yymmdd=${CURRENT_DATE}) SELECT transform(search_id, print_time, pthread_id, ad_s) ${MR_USING} EventFactMidAdxAuctionAdMapper' as search_id, print_time, pthread_id, ad_s, ssp_id WHERE $INSERT_PARTITION and original = 'exinternal' "

率先弹 – 善用MaxCompute编写翻译器的荒唐和警戒

第二弹 –
新的主题数据类型与内建函数

Hive Python Streaming的原理及写法

http://www.tuicool.com/articles/vmumUjA

第二弹 – 新的骨干数据类型与内建函数

其三弹 –
复杂类型

其三弹 – 复杂类型

第四弹 –
CTE,VALUES,SEMIJOIN

第四弹 – CTE,VALUES,SEMIJOIN

上次向您介绍了复杂类型,从本篇开端,向您介绍马克斯Compute在SQL语言DML方面包车型地铁革新

上次向你介绍了CTE,VALUES,SEMIJOIN,本篇向您介绍马克斯Compute对别的脚本语言的扶助

场景1 

  • SELECT TRANSFORM。

  • 场景1

  • 自己的体系要迁移到马克斯Compute平台上,系统中本来有繁多成效是接纳脚本来达成的,满含python,shell,ruby等剧本。
    要迁移到马克斯Compute上,作者必要把这几个本子全体都退换成UDF/UDAF/UDTF。更动进程不止要求消耗费时间间人力,还亟需做一回又二回的测量检验,进而确认保障改变成的udf和原先的台本在逻辑上是等价的。小编梦想能有更简便易行的动员搬迁格局。
  • 场景2
  • SQL相比长于的是集聚操作,而自身索要做的事务要对一条数据做越多的精细的乘除,现存的内置函数不可能便于的完结自个儿想要的效率,而UDF的框架相当不够利索,况兼Java/Python小编都不太熟练。比较之下小编更专长写剧本。笔者就期待能够写七个本子,数据全都输入到本身的剧本里来,笔者要好来做各类总括,然后把结果输出。而马克斯Compute平台就担当帮自个儿把数量做好切分,让作者的本子能够布满式实践,肩负数据的输入表和输出表的军管,负担JOIN,UNION等关系操作就好了。

_急需写两个复现的SQL,
从多个表中读取数据,有个别之间做Join,有些之间做Union,生成中间数据又要Join,
最终索要输出多张表,最终写成了n层嵌套的子查询,本身都看不懂了。并且同样的询问,在差异的子查询中有重新。为了珍惜方便,把复杂的言辞拆成七个语句,不过开掘每一个语句都亟需独自提交,排队,而且要将中等结果写到本来无需的有的时候表,在前面包车型大巴话语中再读出来,慢了众多。。。

上述作用能够应用SELECT TRANSFORM来贯彻

场景2

SELECT TRANSFORM 介绍

正值开拓新项目,供给给三个小数目表筹划些基本数据,可是并未有INSERT …
VALUES
语句,不能够把多少和创制表的DDL放在一齐爱抚,只能另用一些本子,调用ODPS命令行希图数据。。。

此文中动用马克斯Compute Studio作展示,首先,安装马克斯Compute
Studio,导入测量试验马克斯Compute项目,创建工程,塑造三个新的马克斯Compute脚本文件, 如下

场景3

美高梅集团4858 1

想测量检验三个新写的UDF,只写SELECT
myudf(‘123’);会报错,还必须创建叁个dual表,里面加一行数据,好辛劳。假如测验UDAF,还要在测验表里面盘算多行数据,每一遍测量试验分化的输入都要修改表内容依然成立新表,假设有个方法不用创立表也能例外的数额整合测量试验本身的UDF就好了。。。

付给作业能够见到进行安顿(全体进行后的视图):

场景4

美高梅集团4858 2

搬迁一个原先在Oracle上边包车型大巴ETL系统,开选用了 WHERE EXISTS( SELECT
…) 和 WHERE IN (SELECT
…) 那类的言辞,不过发掘ODPS在那上头支持不完整,还要手工业将那些半连连的讲话转变为常见JOIN,再过滤。。。

Select
transform允许sql用户钦点在服务器上实践一句shell命令,将上游数据各字段用tab分隔,每条记下一行,逐行输入shell命令的stdin,并从stdout读取数据作为出口,送到下游。Shell命令的本来面目是调用Unix的一部分utility,因而能够运行其余的脚本解释器。包罗python,java,php,awk,ruby等。

马克斯Compute采纳基于ODPS2.0的SQL引擎,对DML举行了大幅扩张,提升了易用性和兼容性,基本解决了上述难题。

该命令包容Hive的Transform功能,能够参照他事他说加以考察Hive的文书档案。一些亟需当心的点如下:

Common Table Expression (CTE)

  1. Using
    子句钦赐的是要试行的通令,而非能源列表,那或多或少和大多数的MaxCompute
    SQL语法不一致,这么做是为着和hive的语法保持包容。

  2. 输入从stdin传入,输出从stdout传出;

  3. 能够配备分隔符,私下认可使用 \t 分隔列,用换行分隔行;

  4. 能够自定义reader/writer,但用内置的reader/writer会快非常多

  5. 采纳自定义的资源(脚本文件,数据文件等),能够使用 set
    odps.sql.session.resources=foo.sh,bar.txt;
    来钦赐。能够钦赐四个resource文件,用逗号隔开分离(由此不一样意resource名字中蕴藏逗号和分行)。其它我们还提供了resources子句,能够在using
    子句前边钦定 resources ‘foo.sh’, ‘bar.txt’
    来钦赐能源,三种办法是等价的(仿照效法“用odps跑测量检验”的事例);

马克斯Compute帮衬SQL标准的CTE。能够拉长SQL语句的可读性与执行功能。

6.
财富文件会被下载到实践钦命命令的劳作目录,能够应用文件接口打开./bar.txt文件。

此文中运用马克斯Compute Studio作体现,首先,安装MaxCompute
Studio,导入测量检验马克斯Compute项目,创制工程,建设构造二个新的MaxCompute脚本文件, 如下

近年来odps select transform完全合营了hive的语法、成效和表现,包涵input/output row format 以及
reader/writer。Hive上的剧本,超越百分之五十得以向来拿来运转,部分脚本只须要通过简单改动就可以运行。别的大家十分多意义都用比hive更加高实践效用的语言
(C++) 重构,用以优化质量。

美高梅集团4858 3

使用场景比方

可以见到,顶层的union两侧各为贰个join,join的左表是一模二样的询问。通过写子查询的不二等秘书籍,只可以重新这段代码。

答辩上select transform能促成的效应udtf都能实现,不过select
transform比udtf要灵活得多。且select
transform不止帮忙java和python,还扶助shell,perl等别的脚本和工具。
且编写的历程要简明,特别契合adhoc成效的落实。举多少个例子:

采取CTE的法子重写以上语句

  1. 推波助澜造数据

美高梅集团4858 4

美高梅集团4858 5

能够见到,a对应的子查询只须求写三遍,在前面重用,CTE的WITH字句中得以钦点五个子查询,像使用变量相同在漫天讲话中频仍重用。除了重用外,也不要再每每嵌套了。

或许应用python

编译此脚本,能够洞察实行安顿如下

美高梅集团4858 6

美高梅集团4858 7

地点的语句造出一份有50行的数据表,值是从1到50;
测量试验时候的多寡就足以方便造出来了。功用周边轻易,但在此以前是odps的三个痛点,未有福利的法门造数据,就不平价测量试验以及初学者的学习和研讨。当然那也能够由此udtf来兑现,可是急需复杂的流水线:步向ide->写udtf->打包->add
jar/python->create function->施行->drop function->drop
resource。

里头M1, M2,
M4八个分布式任务分别对应相应两个输入表,双击M2可以看来中现实实践的DAG(在DAG中再一次双击能够回去),如下

  1. awk 用户会很爱怜这些职能

美高梅集团4858 8

美高梅集团4858 9

能够看看对src读后实行过滤的DAG。对src的读取与过滤在方方面面实行安顿中只需求一次( 注1 )。

上边的话语仅仅是把value原样输出,不过熟识awk的用户,从此过上了写awk脚本不写sql的日子

VALUES

  1. 用odps跑测试

开创一个新的公文,如下:

美高梅集团4858 10

美高梅集团4858 11

或者

实践后在,马克斯Compute Project
Explorer中可以找到新成立的表,并见到values中的数据现已插入到表中,如下:

美高梅集团4858 12

美高梅集团4858 13

这些例子是为了求证,比很多java的utility能够间接拿来运转。java和python纵然有现存的udtf框架,不过用select
transform编写更简约,而且无需额外重视,也不曾格式须要,以至足以兑现离线脚本拿来直接就用。

部分时候表的列相当多,准备数据的时候希望只插入部分列的数码,此时能够用插队列表功效

  1. 支撑任何脚本语言

美高梅集团4858 14

select transform (key, value) using “perl -e ‘while($input =
<STDIN>){print $input;}'” from src;

举办后,马克斯Compute Project
Explorer中找到目的表,并观望values中的数据现已插入,如下:

地点用的是perl。这实则不唯有是言语援救的增加,一些简便的魔法,awk,
python, perl, shell
都帮衬直接在指令里面写剧本,不须要写脚本文件,上传财富等进程,开荒进程更简明。别的,由于近来大家计算集群上从未有过php和ruby,所以那二种脚本不协助。

美高梅集团4858 15

  1. 能够串联着用,使用 distribute by和 sort by对输入数据做预管理

对此在values中尚无制订的列,能够看来取缺省值为NULL。插入列表功用不明确和VALUES一齐用,对于INSERT
INTO … SELECT…, 同样能够使用。

美高梅集团4858 16

INSERT… VALUES…
有多个范围,values必须是常量,可是有的时候希望在插入的数据中开始展览局地轻松易行的演算,那年能够使用马克斯Compute的VALUES
TABLE功效,如下:

抑或用map,reduce的重大字会让逻辑显得清楚部分

美高梅集团4858 17

美高梅集团4858 18

里面包车型地铁VALUES (…), (…) t (a, b), 也等于概念了四个名称为t,列为a,
b的表,类型为(a string, b
string),个中的花色从VALUES列表中国对外演出公司绎。那样在不盘算任何物理表的时候,能够效仿二个有自由数据的,多行的表,并开始展览自由运算。

辩护上OpenM帕杰罗的模子都得以映射到下面的计量进度。注意,使用map,reduce,select
transform那多少个语法其实语义是一模二样的,用哪个关键字,哪个种类写法,不影响一贯进程和结果。

事实上,VALUES表并不幸免在INSERT语句中使用,任何DML语句都得以应用。

性能

再有一种VALUES表的超过常规规情势

本性上,SELECT TRANSFORM 与UDTF
半斤八两。经过各类场馆临比测量检验,数据量较时辰,大多数场合下select
transform有优势,而数据量大时UDTF有优势。由于transform的开荒特别方便人民群众,所以select
transform极度适合做adhoc的数目解析。

selectabs(-1),length(‘abc’),getdate();

UDTF的优势:

也正是能够不写from语句,直接实行SELECT,只要SELECT的表达式列表不用任何上游表数据就能够。其底层完毕为从三个1行,0列的无名VALUES表选用。那样,在盼望测量检验一些函数,比方自个儿的UDF等,就再也不用手工业创造DUAL表了。

  1. UDTF是有品种,而Transform的子进度基于stdin/stdout传输数据,全数数据都当做string管理,因而transform多了一步类型转变;
  2. Transform数据传输重视于操作系统的管道,而当前管道的buffer独有4KB,且不可能安装,
    transform读/写 空/满 的pipe会导致进度被挂起;
  3. UDTF的常量参数能够不用传输,而Transform不能够利用那一个优化。

SEMI JOIN

SELECT TRANSFORM 的优势:

马克斯Compute援助SEMI JOIN(半老是)。SEMI
JOIN中,右表只用来过滤左表的数量而不出现在结果聚集。扶助的语法满含LEFT
SEMI JOIN,LEFT ANTI JOIN,(NOT) IN SUBQUE讴歌RDXY,(NOT) EXISTS

  1. 子进度和父进程是多少个经过,而UDTF是单线程的,假使总计占比相比较高,数据吞吐量非常小,能够运用服务器的多核性格
  2. 数量的传导通过更底层的系统调用来读写,效用比java高
  3. SELECT
    TRANSFORM援助的少数工具,如awk,是natvie代码完成的,和java相比较理论上恐怕会有总体性优势。

LEFT SEMI JOIN

小结

回来左表中的数据,当join条件创立,也正是mytable1中某行的id在mytable2的兼具id中冒出过,此行就保留在结果聚焦

马克斯Compute基于ODPS2.0的SQL引擎,提供了SELECT
TRANSFORM成效,能够胸有成竹简化对台本代码的引用,与此同不经常间,也抓牢了品质!大家推荐你尽恐怕选用SELECT
TRANSFORM。

例如:

标注

SELECT * from mytable1 a LEFT SEMI JOIN mytable2 b on a.id=b.id;

  • 注一,USING
    后边的字符串,在后台是一直起的子进度来调起命令,未有起shell,所以shell的一些语法,如输入输出重定向,管道等是不协理的。假设用户须求能够以
    shell 作为命令,真正的授命作为数据输入,参谋“无事生非造数据”的例证;
  • 注二,JAVA 和 PYTHON 的实际上路线,能够从JAVA_HOME 和 PYTHON_HOME
    境况变量中收获作业;

只会回去mytable第11中学的数据,只要mytable1的id在mytable2的id中冒出过

作者:隐林

LEFT ANTI JOIN

本文为云栖社区原创内容,未经允许不得转发。回来乐乎,查看愈来愈多

归来左表中的数据,当join条件不创建,也正是mytable1中某行的id在mytable2的保有id中一向不出现过,此行就保留在结果聚集

主要编辑:

例如:

SELECT*frommytable1 aLEFTANTIJOINmytable2 bona.id=b.id;

只会回到mytable第11中学的数据,只要mytable1的id在mytable2的id未有出现过

IN SUBQUERY/NOT IN SUBQUERY

IN SUBQUERY与LEFT SEMI JOIN类似。

例如:

SELECT*frommytable1whereidin(selectidfrommytable2);

等效于

SELECT*frommytable1 aLEFTSEMIJOINmytable2 bona.id=b.id;

土生土养ODPS也支撑IN SUBQUE陆风X8Y,不过不支持correlated条件,马克斯Compute帮衬

例如:

SELECT*frommytable1whereidin(selectidfrommytable2wherevalue=
mytable1.value);

当中子查询中的where value =
mytable1.value就是一个correlated条件,原有ODPS对于这种既援用了子查询中源表,由引用了外围查询源表的表明式时,会告知错误。马克斯Compute扶助这种用法,那样的过滤条件实在构成了SEMI
JOIN中的ON条件的一有的。

对于NOT IN SUBQUEPRADOY,类似于LEFT ANTI JOIN,可是有点分明不一样

例如:

SELECT*frommytable1whereidnotin(selectidfrommytable2);

一经mytable第22中学的全体id都不为NULL,则等效于

SELECT*frommytable1 aLEFTANTIJOINmytable2 bona.id=b.id;

而是,假诺mytable第22中学有其余为NULL的列,则 not
in表达式会为NULL,导致where条件不树立,无数据重回,此时与LEFT ANTI
JOIN不一样。

原有ODPS也支持[NOT] IN
SUBQUEENVISIONY不作为JOIN条件,比如出现在非WHERE语句中,只怕就算在WHERE语句中,但敬敏不谢转移为JOIN条件。马克斯Compute照旧支撑这种用法,可是此时因为不可能调换为SEMI
JOIN而必须兑现运营一个独自的学业来运作SUBQUEENVISIONY,所以不协助correlated条件。

例如:

SELECT*frommytable1whereidin(selectidfrommytable2)ORvalue>0;

因为WHERE中含有了OLacrosse,导致不能够转移为SEMI JOIN,会单独运转作业推行子查询

其它在管理分区表的时候,也是有异乎经常管理

SELECT*fromsales_detailwheredsin(selectdtfromsales_date);

内部的ds倘若是分区列,则select dt from
sales_date 会单独运维作业施行子查询,而不会转接为SEMIJOIN,实践后的结果会挨个与ds比较,sales_detail中ds值不在重返结果中的分区不会读取,保险分区裁剪还是有效。

EXISTS SUBQUERY/NOT EXISTS SUBQUERY

当SUBQUEEscortY中有至少一行数据时候,重回TRUE,不然FALSE。NOT
EXISTS的时候则相反。最近只补助含有correlated WHERE条件的子查询。EXISTS
SUBQUEWranglerY/NOT EXISTS SUBQUE大切诺基Y达成的情势是更换为LEFT SEMI JOIN或然LEFT
ANTI JOIN

例如:

SELECT*frommytable1whereexists(select*frommytable2whereid=
mytable1.id);`

等效于

SELECT*frommytable1 aLEFTSEMIJOINmytable2 bona.id=b.id;

SELECT*frommytable1wherenotexists(select*frommytable2whereid=
mytable1.id);`

则等效于

SELECT*frommytable1 aLEFTANTIJOINmytable2 bona.id=b.id;

其余改进

MaxCompute支持UNION [DISTINCT] – 其中DISTINCT为忽略

SELECT*FROMsrc1UNIONSELECT*FROMsrc2;

实行的功效相当于

SELECTDISTINCT*FROM(SELECT*FROMsrc1UNIONALLSELECT*FROMsrc2) t;

支持IMPLICIT JOIN

SELECT*FROMtable1, table2WHEREtable1.id = table2.id;

实行的职能一定于

SELECT*FROMtable1JOINtable2ONtable1.id = table2.id;

此意义重假诺造福从别的数据库系统迁移,对于信用贷款买,大家依然引入您使用JOIN,显然表暗意图

支持新的SELECT语序

在三个完整的查询语句中,比如

SELECTkey,max(value)FROMsrc tWHEREvalue>0GROUPBYkeyHAVINGsum(value)
>100ORDERBYkeyLIMIT100;

实质上的逻辑推行各样是 FROM->WHERE->GROUY
BY->HAVING->SELECT->OPAJERODER
BY->LIMIT,前三个是后一个的输入,与正式的书写语序实际并不一致样。非常多轻松混淆视听的题材,都以经过孳生的。比方order
by中只好援用select列表中变化的列,实际不是走访FROM的源表中的列。HAVING能够访谈的是
group by key和聚合函数。SELECT的时候,假设有GROUP BY,就只可以访谈group
key和聚合函数,实际不是FROM中源表中的列。

MaxCompute辅助以进行各类书写查询语句,例如地点的口舌可以写为

FROMsrc tWHEREvalue >0GROUPBYkeyHAVING sum(value) >100SELECTkey,
max(value)ORDERBYkeyLIMIT100;

书写顺序和执行顺序一致,就不便于混淆视听了。那样有三个外加的益处,在马克斯Compute
Studio中写SQL语句的时候,会有智能提示的效果与利益,若是是SELECT在前,书写select列表的表明式的时候,因为FROM还尚无写,马克斯Compute
Studio无法知道也许拜谒那多少个列,也就不能做提醒。如下

美高梅集团4858 19

亟待先写好FROM,再回头写SELECT列表,工夫唤起。如下

美高梅集团4858 20

要是运用上述以FROM初始的秘籍书写,则足以束手就擒的基于上下文实行提示。如下

美高梅集团4858 21

支撑顶层UNION

ODPS1.0不帮助顶层UNION。ODPS2.0足以帮忙,举个例子

SELECT*FROMsrcUNIONALLSELECT*FROMsrc;

UNION后LIMIT的语义变化。

好多DBMS系统中,如MySQL,Hive等,UNION后一旦有CLUSTECRUISER BY, DIST本田CR-VIBUTE
BY, SORT BY, O兰德酷路泽DER
BY也许LIMIT子句,其意义于与前方全体UNION的结果,实际不是UNION的末尾一块。ODPS2.0在set
odps.sql.type.system.odps2=true;的时候,也采纳此行为。譬喻:

setodps.sql.type.system.odps2=true;SELECTexplode(array(1,3))AS(a)UNIONALLSELECTexplode(array(0,2,4))AS(a)ORDERBYaLIMIT3;

返回

a

0

1

2

小节

马克斯Compute大大扩张了DML语句的帮忙,在易用性,包容性和个性方面,能够更加好的满意你的必要。对于SQL相比较精通的大方会发掘,上述意义抢先八分之四是标准的SQL帮忙的职能。马克斯Compute会持续进步与行业内部SQL和产业界常用产品的包容性。

而外,针对马克斯Compute用户的性状,也便是亟需在非常复杂的政工场景下,帮助对己多量多少的拍卖,马克斯Compute提供了故意的本子形式和参数化视图,就要下贰次为你介绍。

标注

注1

是否联结大概不同子查询,是由ODPS2.0的依据代价的优化器
(CBO)做出决定的,SQL本身的书写格局,不管是CTE依然子查询,并不可能担保物理实行安顿的合併或许差别。

相关文章

网站地图xml地图