MaxCompute 学习计划(一)

前言

MaxCompue(原名ODPS)是阿里巴巴自主研发的一种快速、完全托管的TB/PB级数据仓库解决方案,获得了很多用户的喜爱。这篇帖子希望能给这些用户关于如何学习使用一些帮助。 帖子本身很少直接介绍MaxCompute的知识,但是会给出如果想学好需要做到什么,像是一张Checklist。当随着时间的积累,你在上面打满了勾的时候,相信你已经能熟练使用MaxCompute进行开发了。在写本学习计划时,因为Datahub和流计算正在重构,暂时不包含在内。

如果在学习过程中遇到任何解决不了的问题,可以在文后和我们留言互动。因为问题或许有共性,或许也能帮到其他人。但是涉及到诸如账号密码,Access Id/Key一类的敏感信息,请务必不要写在留言里,有需要可以提交工单咨询。

大纲

本学习计划主要包含:

  • Mysql SQL
  • MaxCompute SQL
  • UDF/UDAF/UDTF
  • MapReduce和Graph的开发
  • SDK和Tunnel

形式

学习计划不会大篇幅的介绍MaxCompute相关的知识,但是会告诉你如果要完成本篇的学习,需要了解什么。你可能需要翻阅指定的文档,也可能需要使用搜索引擎去搜专业名词的含义。课程会包含一些练习题,希望每个题目都没有问题后再继续下一课的学习。

Mysql SQL

现在的系统架构里,数据被大量地以表的形式存储在数据库里。使用SQL语言进行查询,是分析这些数据最方便的方法。我们可以用SQL非常简单地分析用户的区域分布,了解销量的同比和环比等等。

在本课学习计划的第一课,我们会复习标准的SQL语法。读书时对SQL编写比较自信的同学可以跳过本课,或者直接去看思考题。

数据集

这里选择大家比较熟悉的Emp/Dept表做为数据集。为了方便大家测试,给出了相关的SQL。注意有删表指令,操作前需核实。

DROP TABLE IF EXISTS  `emp`;
CREATE TABLE `emp` (
  `EMPNO` int(4) NOT NULL,
  `ENAME` varchar(10) DEFAULT NULL,
  `JOB` varchar(9) DEFAULT NULL,
  `MGR` int(4) DEFAULT NULL,
  `HIREDATE` date DEFAULT NULL,
  `SAL` int(7) DEFAULT NULL,
  `COMM` int(7) DEFAULT NULL,
  `DEPTNO` int(2) DEFAULT NULL,
  PRIMARY KEY (`EMPNO`),
  KEY `FK_DEPTNO` (`DEPTNO`),
  CONSTRAINT `FK_DEPTNO` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `emp`(`EMPNO`,`ENAME`,`JOB`,`MGR`,`HIREDATE`,`SAL`,`COMM`,`DEPTNO`) values
('7369','SMITH','CLERK','7902','1980-12-17','800',null,'20'),
('7499','ALLEN','SALESMAN','7698','1981-02-20','1600','300','30'),
('7521','WARD','SALESMAN','7698','1981-02-22','1250','500','30'),
('7566','JONES','MANAGER','7839','1981-04-02','2975',null,'20'),
('7654','MARTIN','SALESMAN','7698','1981-09-28','1250','1400','30'),
('7698','BLAKE','MANAGER','7839','1981-05-01','2850',null,'30'),
('7782','CLARK','MANAGER','7839','1981-06-09','2450',null,'10'),
('7788','SCOTT','ANALYST','7566','1987-04-19','3000',null,'20'),
('7839','KING','PRESIDENT',null,'1981-11-17','5000',null,'10'),
('7844','TURNER','SALESMAN','7698','1981-09-08','1500','0','30'),
('7876','ADAMS','CLERK','7788','1987-05-23','1100',null,'20'),
('7900','JAMES','CLERK','7698','1981-12-03','950',null,'30'),
('7902','FORD','ANALYST','7566','1981-12-03','3000',null,'20'),
('7934','MILLER','CLERK','7782','1982-01-23','1300',null,'10');

DROP TABLE IF EXISTS  `dept`;
CREATE TABLE `dept` (
  `DEPTNO` int(2) NOT NULL,
  `DNAME` varchar(14) DEFAULT NULL,
  `LOC` varchar(13) DEFAULT NULL,
  PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `dept`(`DEPTNO`,`DNAME`,`LOC`) values
('10','ACCOUNTING','NEW YORK'),
('20','RESEARCH','DALLAS'),
('30','SALES','CHICAGO'),
('40','OPERATIONS','BOSTON');

作业

这些是从网上找的题目,参考答案网上也有。记得在搜答案之前要先自己写出语句并执行过看看是否符合预期。

1. 列出至少有一个员工的所有部门。
2. 列出薪金比“SMITH”多的所有员工。
3. 列出所有员工的姓名及其直接上级的姓名。
4. 列出受雇日期早于其直接上级的所有员工。
5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
6. 列出所有“CLERK”(办事员)的姓名及其部门名称。
7. 列出最低薪金大于1500的各种工作。
8. 列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号
9. 列出薪金高于公司平均薪金的所有员工。
10.列出与“SCOTT”从事相同工作的所有员工。
11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
13.列出在每个部门工作的员工数量、平均工资和平均服务期限。
14.列出所有员工的姓名、部门名称和工资。
15.列出所有部门的详细信息和部门人数。
16.列出各种工作的最低工资。
17.列出各个部门的MANAGER(经理)的最低薪金。
18.列出所有员工的年工资,按年薪从低到高排序。

  1. 用两种方法求出薪水的最大值。

思考题

  • 表的连接方式都有哪些,各自的使用场景是什么?比如题2和3。(查资料)
  • in和exists遇到子查询结果为空或者有重复的内容的时候结果怎么样?如何改成join?(参考这里

SQL的用法对后面的MaxCompute SQL的学习很有帮助,而且现在市面上学习资料非常多,这里不再赘言。不过这些题目无法代表全部的SQL技能,还需大家多思考多练习。

另外如果大家有从网上搜这些题目的话,可能会惊叹,为什么我的结果和别人的答案不一样。举个例子,就说题2。如果表里有多个叫“SMITH”的员工,那是比任意一个“SMITH”薪金高就返回呢,还是比全部的“SMITH”高?其实更多的是一个理解或者口径的问题,同样的一句话可能有不同的理解。所以这句话我必须要加粗:良好的沟通能力是数据分析师的核心技能之一。

上一篇:前端学习 -- Css -- 有序列表和无序列表


下一篇:ZOOKEEPER典型应用场景解析