开发者社区> 传学> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MaxCompute SQL与标准SQL的主要区别及解决方法

简介: 列举一个写惯了关系型数据库里的SQL的用户,在使用MaxCompute SQL比较容易遇见的问题。
+关注继续查看

这里会列举一个写惯了关系型数据库里的SQL的用户,在使用MaxCompute SQL比较容易遇见的问题。但是具体的语法建议还是参考对应的文档 。希望这篇帖子配合文档,能帮助大家少踩坑,快速上手MaxCompute SQL。

概要

场景

  • 不支持事物(没有commit和rollback,建议代码具有等幂性支持重跑,不推荐使用Insert Into,推荐Insert Overwrite写入数据)。
  • 不支持索引和主外键约束。
  • 不支持自增字段和默认值。如果有默认值,请在数据写入时自行赋值。

分区

精度

  • 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设置的很大。但是谨慎使用,因为无法使用到分布式系统的优势,可能会有性能问题。可以参考这里

screenshot

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
sqlServer存储过程
1、创建存储过程报错:     'CREATE/ALTER PROCEDURE' 必须是查询批次中的第一个语句。 解决方法: use databaseName 后面要加上一句: GO ...
825 0
SQL Server基础之<存储过程>
原文:SQL Server基础之   简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,但是其作用不仅限于批处理。本篇主要介绍变量的使用,存储过程和存储函数的创建,调用,查看,修改以及删除操作。
1477 0
SQLSERVER存储过程语法详解
SQL SERVER存储过程语法: Create PROC [ EDURE ] procedure_name [ ; number ]     [ { @parameter data_type }         [ VARYING ] [ = default ] [ OUTPUT ]     ] [ ,...n ]   [ WITH     { RECOMPILE | ENCRY
1659 0
+关注
传学
传学,专注于大数据领域的解决方案
文章
问答
来源圈子
更多
MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。
+ 订阅
相关文档: MaxCompute
文章排行榜
最热
最新
相关电子书
更多
SQL Sever迁移PG经验
立即下载
MaxCompute SQL介绍
立即下载
MaxCompute SQL计算成本调优以及优化方法
立即下载