一、实验背景介绍
大数据计算服务(MaxCompute,原名 ODPS)是一种快速、完全托管的 GB/TB/PB 级数据仓库解决方案。MaxCompute 向用户提供了完善的数据导入大数据计算服务(MaxCompute,原名 ODPS)是一种快速、完全托管的 GB/TB/PB 级数据仓库解决方案。MaxCompute 向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效降低企业成本,并保障数据安全。本实验结合实际数据和案例,深入浅出的演示了如何使用MaxCompute的内置函数。
完成此实验后,可以掌握的内置函数有:
1. 数值类函数;
2. 字符串类函数;
3. 日期类函数;
二、实验环境架构
实验环境架构:阿里云大数据计算服务MaxCompute
第 1 章:实验准备
1.1 申请MaxCompute资源
请点击页面左侧的 ,在左侧栏中,查看本次实验资源信息。 maxcompute申请MaxCompute资源 MAXCOMPUTE 在弹出的左侧栏中,点击 创建资源 按钮,开始创建实验资源。 资源创建过程需要1-3分钟。完成实验资源的创建后,用户可以通过 实验资源 查看实验中所需的资源信息,例如:阿里云账号等。
1.2 开通服务
(本实验用到odps客户端,创建资源之前确保本地安装了java8或者以上版本) Java下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 1)点击【实验资源】,查看本次实验资源信息(MaxCompute资源)。 2)在弹出的左侧栏中,点击 【创建资源】按钮,开始创建实验资源。 如下图:
注意:实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。 3)创建资源,如下图:(创建资源需要几分钟时间,请耐心等候……) 4)资源创建成功后,可通过【实验资源】查看实验中所需的实验资源信息。如下图:
注意:在本地保存下阿里云账号信息,包括资源中的项目名称、企业别名、子用户名称、子用户密码、AK ID、AK Secret等信息。 沙箱实验环境说明:
企业别名:即主账号ID;
子用户名称和子用户密码:登录实验环境的账号;
AK ID和AK Secret:系统为当前用户分配的登录验证密钥信息,配置odps客户端时需要;
控制台url:登录实验开发环境的地址; 5)点击页面左侧的【控制台url】,复制链接,在新的窗口打开,跳转到登录页。 6)在登录页,输入【实验资源】中提供的账号,格式为:子用户名称@企业别名,再点击【下一步】。 7)输入【实验资源】中提供的的“子用户密码”,点击【登录】 8)登陆后,进入【管理控制台】界面, 点击左侧菜单栏 【大数据(数加)】,再点击【DataWorks】,进入数据开发概览页。
1.3 创建项目
沙箱环境已经默认创建完项目,点击【进入数据开发】即可。 本小节以下步骤供使用个人账号实验参考。
开通MaxCompute后,点击【管理控制台】 选中MaxCompute服务,选择【按量付费】,然后点击【下一步】 填写项目相关信息:输入“项目名称”(全局唯一)、“显示名”以及“项目描述” 信息,然后点击【创建项目】。 项目创建成功后,点击【进入数据开发】:】 打开【数据开发】页面:
1.4 安装配置odpscmd客户端
步骤1:客户端下载 (本实验已经提供好客户端,自行下载附件)
步骤2:解压odpscmd_public.zip 到本地目录,密码:aca21104 如:解压至E:\ODPS_DEMO
步骤3:查看本次实验课用到的介质,可以看到如下的文件夹: 步骤4:在conf文件夹中有odps_config.ini文件。鼠标右键编辑此文件,配置相关信息:
说明:
project_name=<对应实验资源中的项目名称>
access_id=<对应实验资源中的AK ID>
access_key=<对应实验资源中的AK Secret>
end_point=http://service.odps.aliyun.com/api(默认)
tunnel_endpoint=http://dt.odps.aliyun.com (默认)
log_view_host=http://logview.odps.aliyun.com(默认)
https_check=true (默认)
步骤5:修改好配置文件后,鼠标双击运行bin目录下的odpscmd(在Linux系统下是./bin/odpscmd,Windows下运行./bin/odpscmd.bat),现在可以运行 MaxCompute 命令,如: 注意:项目可以随时根据情况切换,上图表示环境设置成功.
1.5 测试表dual准备
在【临时查询】页面,点击【新建】,然后点击【QDPS SQL】 输入“节点名称”,选择“目标文件夹”,然后点击【提交】。 进入脚本编辑页面,进行脚本开发,创建实验测试表dual,点击【运行】。
SQL语句:
CREATE TABLE dual (
id BIGINT
)
LIFECYCLE 10000;
然后查看运行日志日志显示测试表创建成功。 往测试表里插入一条数据,输入SQL语句,点击【运行】。
insert into table dual select count(1) from dual;
查看测试表数据内容,输入SQL语句,点击【运行】。:
select * from dual limit 10;
1.6 测试表t_dml准备
进入脚本编辑页面,进行脚本开发,创建实验测试表t_dml,点击【运行】
create table t_dml (
detail_id bigint,
sale_date datetime,
province string,
city string,
product_id bigint,
cnt bigint,
amt double
);
然后查看运行日志显示测试表创建成功。 打开odpscmd客户端交互界面 执行命令,加载数据 t_dml.csv,(注意修改数据文件存放路径):
tunnel upload f:\data\t_dml.csv t_dml; 查看数据表数据:输入sql语句,点击【运行】,查看结果。
select * from t_dml limit 10;
1.7 测试表t_product准备
进入脚本编辑页面,进行脚本开发,创建实验测试表t_product,点击【运行】。
create table t_product
(product_id bigint, product_name string, category_id bigint, category_name string, price double);
然后查看运行日志显示测试表创建成功。 打开odpscmd客户端交互界面 加载数据 t_product.csv,注意文件路径:
tunnel upload f:\data\t_product.csv t_product; 查看数据表数据,输入sql,点击【运行】。
select * from t_product limit 10;
1.8 测试表t_sign准备
进入脚本编辑页面,进行脚本开发,创建实验测试表t_sign,点击【运行】。
create table t_sign (id bigint, name string, height double, is_female boolean, birth_day datetime);
测试表创建成功 进入odpscmd客户端交互界面 执行命令,加载数据 t_sign.csv:
tunnel upload f:\data\t_sign.csv t_sign;
查看数据表数据,输入sql, 点击【运行】
select * from t_sign limit 10;
第 2 章:实验详情
2.1 数值类函数
(1) 三角函数类
已知三角形两边长度为10,20,夹角为60度,求三角形面积
select 0.51020sin(60/1803.1415926) from dual;
输入sql脚本,点击【运行】,查看结果 (2) 数字整形类:
对数字进行加工处理,请分别显示数字 3.1415926 的向上取整值、向下取整值、四舍五入保留3位小数的值、截掉小数位的值以及用二进制来表示该值。
Select ceil(3.1415926),
floor(3.1415926),
round(3.1415926,3),
trunc(3.1415926),
conv('3.1415926',10,2)
from dual;
输入脚本,点击【运行】,查看结果 (3) 随机函数类:
select rand() from dual;
select rand(detail_id),rand() from t_dml limit 10;
输入sql脚本,点击【运行】,查看结果
(4) 综合使用
使用蒙特卡洛法求π值的近似值:产生一系列的成对的随机数,根据每队随机数到点(0.5,0.5)的距离可判断该点是否在单位圆内,计算落在圆内的点占所有点的比例,即可得到π值的近似值:
// 产生约10万对随机点进行近似值计算:
select (inCircle/totalCnt)/pow(0.5,2) as PI
from (select count(*) as totalCnt,
sum(case when sqrt(pow((x-0.5),2)+pow((y-0.5),2)) <0.5 then 1 else 0 end) inCircle
from (select /*+mapjoin(t2)*/ rand() as x,rand() as y
from (select * from t_dml limit 10000) t1
left outer join (select * from t_dml limit 10) t2
on t1.detail_id <> t2.detail_id) tt
) t;
// 产生约100万对随机点进行近似值计算:
select (inCircle/totalCnt)/pow(0.5,2) as PI
from (select count(*) as totalCnt,
sum(case when sqrt(pow((x-0.5),2)+pow((y-0.5),2)) <0.5 then 1 else 0 end) inCircle
from (select /*+mapjoin(t2)*/ rand() as x,rand() as y
from (select * from t_dml limit 10000) t1
left outer join (select * from t_dml limit 100) t2
on t1.detail_id <> t2.detail_id) tt
) t;
输入脚本,点击【运行】,查看结果: 输入脚本,点击【运行】,查看结果:
2.2 字符串类函数
(1) 长度类:
输入脚本,点击【运行】,查看结果
select province,length(province),lengthb(province) from t_dml limit 10;
(2) 查找类:
目前销售记录中,哪些省、市名字比较接近?
select province, city, char_matchcount(province, city) as sim
from (select distinct province, city
from t_dml) t
order by sim desc
limit 10;
输入脚本,点击【运行】,查看结果 目前销售记录中,省份的第一个字在城市名中是否出现?有没有出现多次的?
select province, city,
instr(city,substr(province,1,3),1,1) as FirstPos,
case when instr(city,substr(province,1,3),1,2) = 0 then 'No'
else 'Yes'
end as SecondPos
from (select distinct province, city
from t_dml) t
order by SecondPos desc, FirstPos desc
limit 10;
输入脚本,点击【运行】,查看结果 (3) 转换类:
要把数据从一个编码为 utf8 的库导入到一个字符集为 gb2132 的库中,其中有些繁体字,如“阿裏雲”等字样,请问会出现乱码的情况吗?
select is_encoding('阿裏雲', 'utf-8', 'gb2312') from dual;
输入脚本,点击【运行】,查看结果 (4) 整形类:
select concat(province, '|',city) from t_dml limit 10;
select category_name, tolower(split_part(category_name,' ',2))
from t_product;
输入脚本,点击【运行】,查看结果 输入脚本,点击【运行】,查看结果
2.3 日期类函数
(1) 日期获取:
//根据日期,截取部分信息
select dt,
datepart(dt, 'yyyy') as year,
datepart(dt, 'mm') as month,
datepart(dt, 'dd') as day,
datepart(dt, 'hh') as hour,
datepart(dt, 'mi') as minute,
datepart(dt, 'ss') as second
from (select getdate() dt from dual) t;
输入脚本,点击【运行】,查看结果 // 日期截取
select datetrunc('2015-01-31 02:30:45', 'dd') from dual;
输入脚本,点击【运行】,查看结果 // 获得具体日期
select getdate(),lastday(getdate()),weekday(getdate()),weekofyear(getdate())
from dual;
输入脚本,点击【运行】,查看结果 (2) 日期转换:
//字符串转成日期, 日期转换成字符串
select to_date('20150131','yyyymmdd'),
to_char('2015-01-31 00:00:00', '日期:yyyymmdd')
from dual;
输入脚本,点击【运行】,查看结果 // Unix时间和ODPS时间互转
select from_unixtime(1), unix_timestamp('2015-10-01 00:00:00') from dual;
输入脚本,点击【运行】,查看结果 // 判断字符串是否满足预定义的日期格式
select sale_date, isdate(sale_date, 'yyyymmdd') from t_dml limit 10;
输入脚本,点击【运行】,查看结果 (3) 日期运算:
统计5月1日从产品5第一次成交后一小时三十分钟内(含),产品5销量(含第一次成交)占同期总销量的比例:
select /+mapjoin(t2)/
sum(case when product_id=5 then cnt else 0 end)/sum(cnt)
from t_dml t1
join (select min(sale_date) as begin_dt,
dateadd(dateadd(min(sale_date),1,'hh'),30, 'mi') as end_dt
from t_dml
where product_id=5
and datetrunc(sale_date,'dd')='2015-05-01 00:00:00')t2
on t1.sale_date >= t2.begin_dt
and t1.sale_date <= t2.end_dt;
输入脚本,点击【运行】,查看结果 日期相减:
select max(sale_date), min(sale_date),
datediff(max(sale_date),min(sale_date),'dd')
from t_dml;
输入脚本,点击【运行】,查看结果
第 3 章:实验总结
3.1 实验总结
MaxCompute的这几类函数基本覆盖了我们日常工作的绝大多数数据处理需求,通过灵活熟练的使用这些函数,
可以提升开发效率,若仍有无法满足的需求,还可以考虑自定义函数。
第 4 章:课后任务
4.1 课后任务
1、计算t_dml表中最大的日期距离2017-08-01的天数
2、计算t_dml表中province字段,以“省”结尾的值的个数
3、计算t_product表各产品价格与产品对应分类下所有产品平均价格的差额,输出产品id和价格差额
来源:oschina
链接:https://my.oschina.net/wyn365/blog/4339725