全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
DataWorks(数据工场)

步骤5:数据统计分析

更新时间:2017-09-06 12:19:12

通过 前文 的操作,您已经成功将 RDS 数据源中的数据同步至 MaxCompute 表中,本文将为您介绍如何通过 MaxCompute SQL、MR 等对数据进行统计分析。

操作步骤

创建目标表

本示例的核心目标为:统计分析出每个城市二手房均价 Top 5 的楼盘,并且给出该楼盘所在城区,即(城市、楼盘、均价、排名和所在城区)。所以要首先创建目标表。

  1. 以项目管理员身份进入 大数据开发套件管理控制台,单击 项目列表 下对应项目操作栏中的 进入工作区

  2. 进入顶部菜单栏中的 数据开发 页面,单击 新建,选择 新建表。如下图所示:

  3. 在新建表页面,输入如下建表语句,单击 确认

    1. CREATE TABLE IF NOT EXISTS house_unit_price_top5 (
    2. house_city STRING,
    3. house_community_name STRING,
    4. house_unit_price_all DOUBLE,
    5. area STRING,
    6. tops BIGINT
    7. )
    8. PARTITIONED BY (
    9. pt STRING
    10. );

创建任务进行数据统计分析

  1. 进入顶部菜单栏中的 数据开发 页面,单击 新建,选择 新建任务。如下图所示:

  2. 新建 ODPS_SQL 节点任务,如下图所示:

    1

编辑 SQL 代码

进入 ODPS_SQL 节点任务页面后,编辑如下 SQL 代码:

  1. --产出每个城市每个楼盘的均价临时表
  2. --分区值是对应数据导入任务配置的分区值,保证每天运行都是取当天导入的最新分区。
  3. DROP TABLE IF EXISTS t_house_unit_price_info;
  4. CREATE TABLE IF NOT EXISTS t_house_unit_price_info
  5. AS
  6. SELECT house_city,
  7. house_community_name,
  8. AVG(house_unit_price) AS house_unit_price_all
  9. FROM house_basic_info
  10. WHERE pt = '${bdp.system.bizdate}'
  11. GROUP BY house_city,
  12. house_community_name;
  13. --拆分house_region字段只取城区名称输出字段为area,并存储到一个临时表。
  14. --分区值是对应数据导入任务配置的分区值,保证每天运行都是取当天导入的最新分区。
  15. DROP TABLE IF EXISTS t_house_area;
  16. CREATE TABLE IF NOT EXISTS t_house_area
  17. AS
  18. SELECT distinct house_city,
  19. house_community_name,
  20. split_part(house_region, ' ', 1) AS area
  21. FROM house_basic_info
  22. WHERE pt = '${bdp.system.bizdate}';
  23. --产出最终目标表:每天每个城市二手房均价top 5的楼盘并且给出该楼盘所在城区。
  24. --分区值是对应数据导入任务配置的分区值,保证每天运行产出的日期分区值与源表数据日期一致。
  25. INSERT OVERWRITE TABLE house_unit_price_top5 PARTITION (pt='${bdp.system.bizdate}')
  26. SELECT a.house_city,
  27. a.house_community_name,
  28. a.house_unit_price_all,
  29. b.area,
  30. a.tops
  31. FROM (
  32. SELECT house_city
  33. house_community_name,
  34. house_unit_price_all,
  35. ROW_NUMBER() OVER (PARTITION BY house_city ORDER BY house_unit_price_all DESC) AS tops
  36. FROM t_house_unit_price_info
  37. ) a
  38. JOIN t_house_area b
  39. ON a.house_city = b.house_city
  40. AND a.house_community_name = b.house_community_name
  41. AND a.tops < 6;

注意

MaxCompoute SQL 语法类似于常用 SQL 语法,可以看作是标准 SQL 的子集,但 MaxCompute 在很多方面并不具备常用数据库的特征,如事务、主键约束、索引等都不支持,因而 SQL 也有一定的差异。

在将数据导入目标表时,已经简单介绍了一些 DDL 语法的差异,针对此处的 DML 语句,简单补充以下内容:

  • 产出每个城市每个楼盘的均价临时表 的整个语句只需要修改 where 条件中的 pt 条件,即可直接在 MySQL 上执行。

  • 拆分 house_region 字段 语句中 split_part() 函数是 MaxCompute 内置的字符串函数,可以直接在 SQL 中使用,对应 MySQL 上 substring_index() 或其他。

  • 产出目标表语句中,ROW_NUMBER() 是 MaxCompute 内置的窗口函数,在本示i例中主要作用于计算排行,可在 SQL 中直接使用,MySQL 上没有可直接对应的函数。

  • 产出目标表语句中,insert overwrite(或 insert into) 后要加 table 关键字,MySQL 或 Oracle 不需要 table 关键字。

  • MaxCompute SQL 和常用 SQl 的更多差异请参见 与其他 SQL 的差异

调度配置和参数配置

编辑好代码后,单击工具栏中的执行按钮执行 SQL 语句,对其进行探查。确定无误后进行调度配置。主要包括调度属性和依赖属性:

  • 调度属性:由于每天调度一次,直接保留默认配置即可。

  • 依赖属性:由于本任务处理的数据来源是数据导入任务 house_basic_info 产出大数据,为了保证本任务执行时,数据导入已经完成,需要将导入任务设置为本任务的上游任务(即父任务)。

    1

注意:

由于本任务中只用到系统参数 ${bdp.system.bizdate},这个参数在系统调度任务时会自动替换,所以无需再进行参数的其他配置。详情请参见 系统参数说明

保存并提交

  1. 单击工具栏中的 保存提交 按钮,将任务提交到调度系统。

  2. 单击工作区右上角 前往运维 按钮,即可到运维中心查看工作流状态。

    1

执行任务

与执行数据导入任务的操作类似。执行成功后可以在 数据开发 模块的 SQL 脚本中查看目标表数据。如下图所示:

1

到目前为止,目标表已经正常产出。但是 MaxCompute SQL 在执行时会有一定的等待调度时间,适合做大数据批处理,网站前端读取数据就不适合直接读 MaxCompute 的数据,所以接下来需要把目标表回流到网站业务库。

后续步骤

现在,您已经学习了如何通过 MaxCompute SQL 对数据进行加工处理,并产出最终目标表,您可以继续学习下一个教程。在该教程中您将学习如何把目标表回流到网站业务库。详情请参见 数据回流

本文导读目录