MaxCompute SQL与标准SQL的主要区别及解决方法
2017-03-15 10:47
302 查看
原文链接:http://click.aliyun.com/m/13940/
这里会列举一个写惯了关系型数据库里的SQL的用户,在使用MaxCompute SQL比较容易遇见的问题。但是具体的语法建议还是参考对应的文档 。希望这篇帖子配合文档,能帮助大家少踩坑,快速上手MaxCompute SQL。
不支持索引和主外键约束。
不支持自增字段和默认值。如果有默认值,请在数据写入时自行赋值。
一次查询输入的分区数不能大于1万 。另外如果是2级分区且查询时只根据2级分区进行过滤,总的分区数大于1万也可能导致这个问题。
一次查询输出的分区数不能大于2048 。
目前产品上已经支持高精度的类型Decimal。但如果有更高精度要求的,可以先把数据存成String类型,然后使用UDF来实现对应的计算。
关于日期型和字符串的隐式转换。在需要传入日期型的函数里如果传入一个字符串,字符串和日期类型的转换根据yyyy-mm-dd hh:mi:ss格式进行转换。如果是其他格式请参考内建函数TO_DATE部分。
支持增加列,但是不支持删除列以及修改列的数据类型,参考这里 。如果有需要一定要操作,最安全的方法参考这里 。
目前只支持Insert Into/Overwrite Table TabeName Select的语法批量插入数据,目前还不支持Insert Into/Overwrite Table TableName Values(xxx)的语法。但是如果确实有需要,可以参考这里。
数据插入表的字段映射不是根据Select的别名做的,而是根据Select的字段的顺序和表里的字段的顺序。
Group by查询里的Select字段,要么是Group By的分组字段,要么需要使用聚合函数。这里可以从逻辑角度理解,假如发现一个非分组列同一个Group By Key里的数据有多条,那么不使用聚合函数的话就没办法展示了。
![](https://yqfile.alicdn.com/7486f59d7b34fc5a954a38ede3482970b17bcc2f.png)
这里会列举一个写惯了关系型数据库里的SQL的用户,在使用MaxCompute SQL比较容易遇见的问题。但是具体的语法建议还是参考对应的文档 。希望这篇帖子配合文档,能帮助大家少踩坑,快速上手MaxCompute SQL。
概要
场景
不支持事物(没有commit和rollback,建议代码具有等幂性支持重跑,不推荐使用Insert Into,推荐Insert Overwrite写入数据)。不支持索引和主外键约束。
不支持自增字段和默认值。如果有默认值,请在数据写入时自行赋值。
分区
单表支持6万个分区。一次查询输入的分区数不能大于1万 。另外如果是2级分区且查询时只根据2级分区进行过滤,总的分区数大于1万也可能导致这个问题。
一次查询输出的分区数不能大于2048 。
精度
Double类型因为存在精度问题,不建议在关联时候进行直接等号关联两个Double字段。一个比较推荐的做法是把两个数做下减法,如果差距小于一个预设的值就认为是相同,比如abs(a1- a2) < 0.000000001。目前产品上已经支持高精度的类型Decimal。但如果有更高精度要求的,可以先把数据存成String类型,然后使用UDF来实现对应的计算。
数据类型转换
为了防止出现各种预期外的错误,建议如果有2个不同的字段类型需要做Join,还是自己先把类型转好了后再Join,同时还能让代码更容易维护。关于日期型和字符串的隐式转换。在需要传入日期型的函数里如果传入一个字符串,字符串和日期类型的转换根据yyyy-mm-dd hh:mi:ss格式进行转换。如果是其他格式请参考内建函数TO_DATE部分。
DDL
表结构
不能修改分区列列名,只能修改分区列对应的值。具体分区列和分区的区别可以参考这里支持增加列,但是不支持删除列以及修改列的数据类型,参考这里 。如果有需要一定要操作,最安全的方法参考这里 。
DML
INSERT
最直观的区别就是Insert into/overwrite后面有个关键字Table。目前只支持Insert Into/Overwrite Table TabeName Select的语法批量插入数据,目前还不支持Insert Into/Overwrite Table TableName Values(xxx)的语法。但是如果确实有需要,可以参考这里。
数据插入表的字段映射不是根据Select的别名做的,而是根据Select的字段的顺序和表里的字段的顺序。
UPDATE/DELETE
目前不支持Update/Delete语句,如果有需要可以参考这里。另外对于删除,还可以参考这里。SELECT
输入表的数量不能超过16张。Group by查询里的Select字段,要么是Group By的分组字段,要么需要使用聚合函数。这里可以从逻辑角度理解,假如发现一个非分组列同一个Group By Key里的数据有多条,那么不使用聚合函数的话就没办法展示了。
子查询
子查询必须要有别名。查询带个别名是个好习惯。IN/NOT IN
关于In/Not In,Exist/Not Exist,后面跟的子查询数据量不能超过1000条,解决办法参考这里。如果业务上已经保证了子查询返回结果的唯一性,可以考虑去掉Distinct增加查询性能。SQL返回10000条
MaxCompute限制了SQL语句返回的数据条数,用户可以参考这里配置。不过可以看到,目前最高可以设置到1万。如果需要查询的结果数据条数很多,可以参考这里配和Tunnel获取全部数据。MAPJOIN
Join不支持笛卡尔积,也就是Join必须要用On设置关联条件。如果有一些小表需要做广播表,需要用Mapjoin Hint。具体可以参考这里。ORDER BY
Order By 后面需要配合Limit n使用。如果希望做很大的数据量的排序,甚至需要做全表排序,可以把这个N设置的很大。但是谨慎使用,因为无法使用到分布式系统的优势,可能会有性能问题。可以参考这里。![](https://yqfile.alicdn.com/7486f59d7b34fc5a954a38ede3482970b17bcc2f.png)
相关文章推荐
- MaxCompute SQL与标准SQL的主要区别及解决方法
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
- SQL compute by 的使用 主要是针对与 GROUP BY 的区别
- PD 15.1 安装 破解 , 简单使用 (一对多,多对多关系生成sql脚本) , CDM 和 PDM 的区别;PD15.1 生成sql2008 无FK外键约束的解决方法
- MySQL死锁问题实例分析及解决方法(主要是SQL语句可能会产生的问题)
- SQL安装挂起,解决方法
- 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结.
- SQL 2005 Reporting Service 出现:“提供程序加载失败”(Provider Load failure)的解决方法
- 一年没有更新自己的BLOG了,主要是记录一些从sqlserver导数据到oracle的解决方法
- 用PowerDesigner设计表时,生成的SQL语句中表名和列名总是带引号的解决方法
- ARP解决方法/工具+真假ARP防范区别方法+ARP终极解决方案
- ARP解决方法/工具 真假ARP防范区别方法 ARP终极解决方案
- [好个变态的sql]安装SQL server 出现syntax error的解决方法
- IE和FIREFOX下CSS的区别与解决方法第1/2页
- IE和FIREFOX下CSS的区别与解决方法第1/2页
- Microsoft SQLServer安装出现“挂起”现象解决方法
- 忘记SQLServer SA密码的解决方法
- SQL安装中常出现的问题与解决方法
- Hibernate继承映射的“Could not format discriminator value to SQL string”错误解决方法
- 导入SQL导致"MySQL server has gone away"的解决方法