概述
odps
目前只开放了
sql
功能。不过哪怕是mr功能开放了后,sql应该还是最主要的
开发
方式。sql相对而言,开发难度低,容易上手,调试方便,实在是开发测试必备
工具
。
今天我们来聊聊odps的sql。
估计会看到这篇帖子的人基本都是搞过开发的,写的sql是得心应手。不过odps的sql和标准的sql还是有一些区别的,这里一一道来。如果中间有遗漏的,也麻烦跟帖补充。
关键字
odps的关键字和sql的不一样,所以建表的时候有时候不注意也会有
问题
。上次看到有人创的表字段叫date的或者叫datetime的没成功的。用其他关键字报错的比较少。
数据类型
目前支持的数据类型有bigint、double、boolean、datetime、string。这个和关系型
数据库
的数据类型有一些对应但不完全相同。
DDL
创建表
在odps里有3种方法
第一种是最标准的创表,指定表名,每一列的列名类型啥的,这个看api就是了,基本没啥区别。
第二种是create table table1 like table2; 这个sql会完全拷贝table2的结构,但是不会拷贝里面的数据
第三种是create table table1 as select xxxxxxxxxxxxxxx;
这三种的语句其实在关系型数据库里的写法是一样的,区别是
生命周期
。生命周期是指如果数据多久没发生变化,表的数据会被删掉。具体的细节就去看文档吧。这里写一下第三种写法的指定生命周期的方法 create table table1 lifecycle N as select xxxx
修改表
的话,odps不支持修改列的类型,什么一开始是bigint现在要改string就只能重新创新的表然后把数据导入过去。
DML
select
1.没有union,只有union all,而且union all
不支持顶级的两个查询结果合并,要改写为一个子查询的形式 就像是
SELECT * FROM (
SELECT * FROM sale_detail WHERE region = 'hangzhou'
UNION ALL
SELECT * FROM sale_detail WHERE region = 'shanghai')
tmp;
2.另外一个比较常见的是关系型数据库使用比较多的(比如我)刚开始用的会很不习惯,因为表的关联只能用join,以前比较习惯的select * from table1,table2,table3 where xxx不能用了。全部改成join。join还支持left outer join、right outer join、full outer join
3.所有的order by后面都需要加limit。如果你需要全排序,就把limit后的数字放大一些。
4.in后面跟的内容不能超过1000个,如果你是in (select xxx from xxxxx) 这样的话,子查询的返回结果不能超过1000个。真需要就改成join来实现功能
5.子查询不能用 xx = (select xxx from xxx) 这种关联了,要么改成in 要么改成join
6.mapjoin odps不支持笛卡尔积,所有的表关联都必须要跟join。因为把海量的数据做笛卡尔积是不可行的。但是如果其中一个表比较小,笛卡尔积也是可以的,这时候需要用mapjoin把小表缓存到内存里。另外一个使用mapjoin的场景就是大表和小表关联的时候,用mapjoin把小表缓存起来,可以提高性能。
7.select a.area,count(*) as count from table1 a group by a.area order by area limit 10; group by后的结果算是一个临时的子查询,所以order by后面的area前面不能加a.
8.诚然,我们支持一个表4万个分区。但是分区太多的话,做全表扫描的时候,执行计划会非常长。目前有一个限制,执行计划的长度不能超过1024KB。所以,合理规划分区的使用。
insert
1.insert目前有2中模式,覆盖模式和追加模式,分别是 insert overwrite和insert into
2.insert语句的标准格式是insert into table table_name xxx 有一个table关键字
3.没有逐条插入的功能,也就是insert into table xxx values (xxxxxxxxx)这种功能,所以偶尔造数据的时候,
自
己建一个一条记录的表很有用。我是在我的project建了一张表后马上create table dual as select count(*) as count from xxx;创了一张表
update / delete
odps没有update也没有delete。不过这俩功能可以用insert overwrite来实现。比如update你就把update后的结果查询出来再insert overwrite进去。delete更方便了,就insert overwrite table xxx select * from xxx where 1=2;插入0条记录来覆盖。另外delete还有一个方法就是删除表(rename)后重建。
其他
odps没有事务的概念,也不存在主键
odps的sql的注释只有--注释,没有/**/,所以只能一行行加注释
最后
以上就是务实斑马为你收集整理的odps随笔01的全部内容,希望文章能够帮你解决odps随笔01所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复