阿里云数加平台尝试之简单数据统计

对于所有的需求,当你不知道怎么处理的时候,你就先用最简单的方法,或者说的明白一点,用最原始的方法,先实现业务需求再说。

遇到的问题

我们的电商平台每天都会产生一些访问及销售数据,最开始的时候仅仅需要统计各店铺的数据。有一天,产品妹子说:“我们现在还需要渠道的数据,你给搞一下吧。”

由于以前并没有做过数据统计相关的工作,所以最开始的数据统计系统是这样设计的。

写一个脚本,每天凌晨执行一次。脚本的任务就是从业务库拉去前一天的数据,然后进行相应的计算,最后写到统计结果表中。

这次产品妹子来新需求了,我就得苦逼的再写这么一个脚本。一次无所谓,但是如果以后再来新需求呢?

作为一只聪明的猿,肯定得想办法摆脱这个坑!

一、对提现队列数据表“ims_checkout_task”进行汇总统计,按月汇总统计每个月的提现总额,提现总次数。

数加之初步了解

大概半年前初步了解过阿里云的数加平台。数加是阿里云依托DataIDE、ODPS、机器学习等等建立起来的一个庞大的大数据系统。如下图,这是今年8月9日阿里云全面升级
DT
NEXT极致未来新品发布会后官网的变化。与原先相比,产品线更加一目了然。原先我们经常用到的ECS、RDS、OSS等都归属为云计算基础服务,新增了大数据(数加)栏目。其中就有我们今天要讲到的大数据开发套件(DataIDE)和大数据计算服务(MaxCompute),其中MaxCompute原名ODPS,所以现在很多地方还叫ODPS,这里需要稍微注意一下。

澳门贵宾会注册送豪礼 1

8月9日阿里云官方升级之后

1、SQL操作如下:

数加之DataIDE

DataIDE即所谓的大数据开发套件。如下图:

澳门贵宾会注册送豪礼 2

数加控制台首页

澳门贵宾会注册送豪礼 3

数据开发工作台

澳门贵宾会注册送豪礼,DataIDE的功能主要分为三部分,即ODPS_SQL、数据同步、机器学习。由于对机器学习并不了解所以并没有深入学习,我们的数据统计仅需要数据同步和ODPS_SQL即可。

数据同步就是将业务数据库中的数据同步到ODPS中。
ODPS_SQL的作用就是你可以根据你的统计需求像写普通SQL一样完成统计。

SELECT id,SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 11 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '0',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 10 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '1',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 9 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '2',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 8 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '3',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 7 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '4',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 6 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '5',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 5 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '6',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 4 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '7',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 3 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '8',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 2 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '9',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '10',SUM(case when FROM_UNIXTIME(addTime,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 0 MONTH),'%Y-%m') AND `status` = 1 then money else 0 end) as '11'FROM ims_checkout_task

数加之ODPS

ODPS,全称Open Data Processing
Service。即开放数据处理服务,是一个海量数据处理平台。

我其实是对大数据的了解很有限,所以对这种高大上的东西很是向往,同时对它也没有一个明确的认识。那么索性我们就先简单的把它理解成一种离线的可以提供海量数据计算的数据库

2、数据库返回如下:

如何利用DataIDE和ODPS进行简单的数据统计

上面我们初步了解了DataIDE和ODPS,下面我们来看下如何通过DataIDE和ODPS来解决产品妹子给我提的新需求。

先看下产品妹子需要的渠道数据都有哪些。

澳门贵宾会注册送豪礼 4

渠道数据概况

澳门贵宾会注册送豪礼 5

渠道数据历史趋势

嗯,从原型上来看主要需要两部分数据,即销售数据和访问数据。

再来看下我们的业务数据是什么样子的。

我们有一张订单表,销售数据可以通过订单表计算出来。
我们还有一个用户访问记录表,那么访问数据也就有了。

3、关键词:case when

DataIDE之数据同步节点

有了上面的两张表,我们需要做的工作就很简单了。

首先,我们在DataIDE的控制台新建一个任务。然后在任务面板新建一个数据同步节点。如下图中的订单表和访问记录表就是两个数据同步节点

澳门贵宾会注册送豪礼 6

数据同步节点

双击同步节点对齐进行相应配置。

澳门贵宾会注册送豪礼 7

数据同步节点配置

如上图。首先选择数据来源,选择源数据中的数据表,选择完毕后系统会自动拉去源数据的数据表结构显示在下方。然后选择数据流向和ODPS中的表。需要注意的是初次使用时,需要自行创建ODPS中的表

最后需要设置数据过滤规则。如下图:

澳门贵宾会注册送豪礼 8

数据抽取和加载控制

这里需要注意的是数据过滤中的语句是普通的SQL不是ODPS_SQL。

//流程控制语句case语法,例如,如果sex字段值为1,则输出男;如果sex值为2,则输出女;否则输出其他CASE sexWHEN '1' THEN '男'WHEN '2' THEN '女'ELSE '其他' END//所以上面的SQL为,如果条件成立,则输出提现金额money字段,否则输出0.

DataIDE之ODPS_SQL节点

因为大同小异,所以这里我们仅以销售数据的统计节点为例进行讲解。如下图:

澳门贵宾会注册送豪礼 9

渠道销售数据统计节点

可以看到,基本语法上来说和普通SQL差别不大。我们需要统计渠道的付款订单数量和订单金额,所以我们直接COUNT(id),SUM(payment_fee)并GROUP
BY
spm。这都是基本的SQL用法这里就不多说了,不了解的朋友可以自行搜索学习。需要注意的是TO_DATE是ODPS_SQL内置的函数,ODPS_SQL有很多内置函数,大家可以自行查阅手册。

另外就是${bdp.system.bizdate}${bdp.system.cyctime}是DataIDE的两个系统参数。它们分别代表日常调度实例定时时间的前一天日常调度实例定时时间

时间处理

最终

最终节点任务执行完成就会生成以下数据

澳门贵宾会注册送豪礼 10

渠道销售数据

澳门贵宾会注册送豪礼 11

渠道访问数据

那么,结束了么?

如果你以为结束了,那么只能说明你跟我一样很天真!

还记得我们最初给ODPS的理解么?一个离线的可以提供海量数据计算的数据库!注意离线二字。由于离线,所以实际过程中是你提交一条ODPS_SQL上去,然后得等一会儿才会有结果返回来。这就是跟普通数据库的一个很重要的差别。

所以注定ODPS无法为业务系统提供查询服务。

所以,我们还需要将统计结果数据从ODPS拉去到统计中心的的普通数据库中去。那么该如何操作呢?

ODPS提供了SDK,通过SDK可以很方便的拉去ODPS中的数据,但是。。。

What?没有PHP版本的SDK?只有Java版本和Python版本的?

妈哒,说好的PHP是最好的语言呢?

还好,本猿对Python也略有涉猎(傲娇脸)

最终将结果数据汇总到RDS中。

澳门贵宾会注册送豪礼 12

最终统计出来的渠道数据

//对时间戳格式化成 2018-10FROM_UNIXTIME(addTime,'%Y-%m')//SQL获取当前时间格式 2019-08 ,根据expr值不同,依次获取前一个月1,前两个月2 ···DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 0 MONTH),'%Y-%m')// 函数用于以不同的格式显示日期/时间数据。DATE_FORMAT(date,format)//函数从日期减去指定的时间间隔。DATE_SUB(date,INTERVAL expr type)//函数返回当前的日期。CURDATE()

结尾

搞定!有了DataIDE和ODPS,再也不怕产品妹子给我提数据统计的需求咯~

对了,有同样正在玩数加的欢迎留言交流。没有人交流全靠自己摸索太痛苦了~


我是闫大伯,一只对一切不了解事物充满探索欲的野生程序猿

例如

SELECT NOW(),CURDATE(),CURTIME()

例如

SELECT DAYOFWEEK(NOW()),WEEKDAY(now()),DATE_FORMAT(NOW(),"%w"),NOW()

二、对积分订单数据表按周汇总统计订单量,比如今天是周二,返回周一到周二的每天单量汇总数据,依次类推

1、SQL操作如下:

SELECT id,SUM(case when DATE_FORMAT(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),'%w') = 1 AND WEEK(date_add(curdate(),interval 6 day),2) = WEEK(date_add(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),interval 6 day),2) AND `pay_status` = 1 then 1 else 0 end) as '0',SUM(case when DATE_FORMAT(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),'%w') = 2 AND WEEK(date_add(curdate(),interval 6 day),2) = WEEK(date_add(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),interval 6 day),2) AND `pay_status` = 1 then 1 else 0 end) as '1',SUM(case when DATE_FORMAT(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),'%w') = 3 AND WEEK(date_add(curdate(),interval 6 day),2) = WEEK(date_add(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),interval 6 day),2) AND `pay_status` = 1 then 1 else 0 end) as '2',SUM(case when DATE_FORMAT(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),'%w') = 4 AND WEEK(date_add(curdate(),interval 6 day),2) = WEEK(date_add(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),interval 6 day),2) AND `pay_status` = 1 then 1 else 0 end) as '3',SUM(case when DATE_FORMAT(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),'%w') = 5 AND WEEK(date_add(curdate(),interval 6 day),2) = WEEK(date_add(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),interval 6 day),2) AND `pay_status` = 1 then 1 else 0 end) as '4',SUM(case when DATE_FORMAT(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),'%w') = 6 AND WEEK(date_add(curdate(),interval 6 day),2) = WEEK(date_add(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),interval 6 day),2) AND `pay_status` = 1 then 1 else 0 end) as '5',SUM(case when DATE_FORMAT(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),'%w') = 0 AND WEEK(date_add(curdate(),interval 6 day),2) = WEEK(date_add(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),interval 6 day),2) AND `pay_status` = 1 then 1 else 0 end) as '6'FROM ims_integral_order

2、数据库返回如下:

3、关键词

//格式化时间戳,返回星期数,注意周日返回值为0DATE_FORMAT(FROM_UNIXTIME(pay_time,'%Y-%m-%d'),'%w')//返回当前时间为一年中第几周WEEK(DATE_ADD(CURDATE(),interval 6 day),2)//获取指定日期是一年中的第几周WEEK(date,mode)//函数向日期添加指定的时间间隔。DATE_ADD(date,INTERVAL expr type)//所以上面的查询条件为星期和第几周同时满足 

影子是一个会撒谎的精灵,它在虚空中流浪和等待被发现之间;在存在与不存在之间….

总结

以上所述是小编给大家介绍的SQL对数据进行按月统计或对数据进行按星期统计的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

发表评论

电子邮件地址不会被公开。 必填项已用*标注