本文为您介绍如何通过DataWorks加工采集至MaxCompute的日志数据,并进行用户画像。

前提条件

开始本实验前,请首先完成采集数据中的操作。

新建数据表

  1. 进入数据开发页面。
    1. 登录DataWorks控制台
    2. 在左侧导航栏,单击工作空间列表
    3. 选择工作空间所在地域后,单击相应工作空间后的进入数据开发
  2. 数据开发页面,打开新建的业务流程。右键单击MaxCompute,选择新建 >
  3. 新建表对话框中,输入表名,单击提交
    此处需要创建3张表,分别为ODS层表(ods_log_info_d)、DW层表(dw_user_info_all_d)和RPT层表(rpt_user_info_d)。
  4. 通过DDL模式新建表。
    • 新建ods_log_info_d表。
      双击ods_log_info_d表,在右侧的编辑页面单击DDL模式,输入下述建表语句。
      --创建ODS层表
      CREATE TABLE IF NOT EXISTS ods_log_info_d (
        ip STRING COMMENT 'ip地址',
        uid STRING COMMENT '用户ID',
        time STRING COMMENT '时间yyyymmddhh:mi:ss',
        status STRING COMMENT '服务器返回状态码',
        bytes STRING COMMENT '返回给客户端的字节数',
        region STRING COMMENT '地域,根据ip得到',
        method STRING COMMENT 'http请求类型',
        url STRING COMMENT 'url',
        protocol STRING COMMENT 'http协议版本号',
        referer STRING COMMENT '来源url',
        device STRING COMMENT '终端类型 ',
        identity STRING COMMENT '访问类型 crawler feed user unknown'
      )
      PARTITIONED BY (
        dt STRING
      );
    • 新建dw_user_info_all_d表。
      双击dw_user_info_all_d表,在右侧的编辑页面单击DDL模式,输入下述建表语句。
      --创建DW层表
      CREATE TABLE IF NOT EXISTS dw_user_info_all_d (
        uid STRING COMMENT '用户ID',
        gender STRING COMMENT '性别',
        age_range STRING COMMENT '年龄段',
        zodiac STRING COMMENT '星座',
        region STRING COMMENT '地域,根据ip得到',
        device STRING COMMENT '终端类型 ',
        identity STRING COMMENT '访问类型 crawler feed user unknown',
        method STRING COMMENT 'http请求类型',
        url STRING COMMENT 'url',
        referer STRING COMMENT '来源url',
        time STRING COMMENT '时间yyyymmddhh:mi:ss'
      )
      PARTITIONED BY (
        dt STRING
      );
    • 新建rpt_user_info_d表。
      双击rpt_user_info_d表,在右侧的编辑页面单击DDL模式,输入下述建表语句。
      --创建RPT层表
      CREATE TABLE IF NOT EXISTS rpt_user_info_d (
        uid STRING COMMENT '用户ID',
        region STRING COMMENT '地域,根据ip得到',
        device STRING COMMENT '终端类型 ',
        pv BIGINT COMMENT 'pv',
        gender STRING COMMENT '性别',
        age_range STRING COMMENT '年龄段',
        zodiac STRING COMMENT '星座'
      )
      PARTITIONED BY (
        dt STRING
      );
      									
  5. 建表语句输入完成后,单击生成表结构确认覆盖当前操作。
  6. 返回建表页面后,在基本属性中输入表的中文名。
  7. 完成设置后,分别单击提交到开发环境提交到生产环境
    说明 如果您使用的是简单模式的工作空间,页面仅显示提交到生产环境

设计业务流程

业务流程节点间依赖关系的配置请参见采集数据

双击新建的业务流程打开编辑页面,鼠标单击ODPS SQL并拖拽至右侧的编辑页面。在新建节点对话框中,输入节点名称,单击提交

此处需要新建三个ODPS SQL节点,依次命名为ods_log_info_d、dw_user_info_all_d和rpt_user_info_d,并配置如下图所示的依赖关系。设计业务流程

创建用户自定义函数

  1. 新建资源。
    1. 下载ip2region.jar
    2. 数据开发页面打开业务流程,右键单击MaxCompute,选择新建 > 资源 > JAR
      JAR
    3. 新建资源对话框中,单击选择文件,选择已经下载至本地的ip2region.jar后,单击点击上传
      点击提交
    4. 单击确定
  2. 注册函数。
    1. 数据开发页面打开业务流程,右键单击MaxCompute,选择新建 > 函数
    2. 新建函数对话框中,输入函数名称(示例为getregion),单击提交
    3. 注册函数对话框中,配置各项参数。
      注册函数
      参数 描述
      函数类型 选择函数类型。
      MaxCompute引擎实例 默认不可以修改。
      函数名 新建函数时输入的函数名称。
      责任人 选择责任人。
      类名 输入org.alidata.odps.udf.Ip2Region
      资源列表 输入ip2region.jar
      描述 输入IP地址转换地域。
      命令格式 输入getregion(‘ip’)
      参数说明 输入IP地址。
    4. 分别单击工具栏中的保存提交图标。

配置ODPS SQL节点

  1. 配置ods_log_info_d节点。
    1. 双击ods_log_info_d节点,进入节点配置页面。
    2. 在节点编辑页面,编写如下SQL语句。
      INSERT OVERWRITE TABLE ods_log_info_d PARTITION (dt=${bdp.system.bizdate})
      SELECT ip
        , uid
        , time
        , status
        , bytes 
        , getregion(ip) AS region --使用自定义UDF通过IP得到地域。
        , regexp_substr(request, '(^[^ ]+ )') AS method --通过正则把request差分为3个字段。
        , regexp_extract(request, '^[^ ]+ (.*) [^ ]+$') AS url
        , regexp_substr(request, '([^ ]+$)') AS protocol 
        , regexp_extract(referer, '^[^/]+://([^/]+){1}') AS referer --通过正则清晰refer,得到更精准的URL。
        , CASE
          WHEN TOLOWER(agent) RLIKE 'android' THEN 'android' --通过agent得到终端信息和访问形式。
          WHEN TOLOWER(agent) RLIKE 'iphone' THEN 'iphone'
          WHEN TOLOWER(agent) RLIKE 'ipad' THEN 'ipad'
          WHEN TOLOWER(agent) RLIKE 'macintosh' THEN 'macintosh'
          WHEN TOLOWER(agent) RLIKE 'windows phone' THEN 'windows_phone'
          WHEN TOLOWER(agent) RLIKE 'windows' THEN 'windows_pc'
          ELSE 'unknown'
        END AS device
        , CASE
          WHEN TOLOWER(agent) RLIKE '(bot|spider|crawler|slurp)' THEN 'crawler'
          WHEN TOLOWER(agent) RLIKE 'feed'
          OR regexp_extract(request, '^[^ ]+ (.*) [^ ]+$') RLIKE 'feed' THEN 'feed'
          WHEN TOLOWER(agent) NOT RLIKE '(bot|spider|crawler|feed|slurp)'
          AND agent RLIKE '^[Mozilla|Opera]'
          AND regexp_extract(request, '^[^ ]+ (.*) [^ ]+$') NOT RLIKE 'feed' THEN 'user'
          ELSE 'unknown'
        END AS identity
        FROM (
          SELECT SPLIT(col, '##@@')[0] AS ip
          , SPLIT(col, '##@@')[1] AS uid
          , SPLIT(col, '##@@')[2] AS time
          , SPLIT(col, '##@@')[3] AS request
          , SPLIT(col, '##@@')[4] AS status
          , SPLIT(col, '##@@')[5] AS bytes
          , SPLIT(col, '##@@')[6] AS referer
          , SPLIT(col, '##@@')[7] AS agent
        FROM ods_raw_log_d
        WHERE dt = ${bdp.system.bizdate}
      ) a;
    3. 单击工具栏中的保存图标。
  2. 配置dw_user_info_all_d节点。
    1. 双击dw_user_info_all_d节点,进入节点配置页面。
    2. 在节点编辑页面,编写如下SQL语句。
      INSERT OVERWRITE TABLE dw_user_info_all_d PARTITION (dt='${bdp.system.bizdate}')
      SELECT COALESCE(a.uid, b.uid) AS uid
        , b.gender
        , b.age_range
        , b.zodiac
        , a.region
        , a.device
        , a.identity
        , a.method
        , a.url
        , a.referer
        , a.time
      FROM (
        SELECT *
        FROM ods_log_info_d
        WHERE dt = ${bdp.system.bizdate}
      ) a
      LEFT OUTER JOIN (
        SELECT *
        FROM ods_user_info_d
        WHERE dt = ${bdp.system.bizdate}
      ) b
      ON a.uid = b.uid;
    3. 单击工具栏中的保存图标。
  3. 配置rpt_user_info_d节点。
    1. 双击rpt_user_info_d节点,进入节点配置页面。
    2. 在节点编辑页面,编写如下SQL语句。
      INSERT OVERWRITE TABLE rpt_user_info_d PARTITION (dt='${bdp.system.bizdate}')
      SELECT uid
        , MAX(region)
        , MAX(device)
        , COUNT(0) AS pv
        , MAX(gender)
        , MAX(age_range)
        , MAX(zodiac)
      FROM dw_user_info_all_d
      WHERE dt = ${bdp.system.bizdate}
      GROUP BY uid;
    3. 单击工具栏中的保存图标。

提交业务流程

  1. 在业务流程的编辑页面,单击提交图标,提交业务流程中已配置完成的节点。
  2. 提交对话框中,选择需要提交的节点,选中忽略输入输出不一致的告警
  3. 单击提交

运行业务流程

  1. 在业务流程的编辑页面,单击工具栏中的运行图标,验证代码逻辑。
  2. 待所有任务运行完成显示绿色箭头后,在左侧导航栏,单击临时查询
  3. 临时查询面板,右键单击临时查询,选择新建节点 > ODPS SQL
  4. 编写并执行SQL语句,查询任务运行结果,确认数据产出。
    查询结果
    查询语句如下所示,通常默认业务日期为运行日期的前一天。
    ---查看rpt_user_info_d数据情况。
    select * from rpt_user_info_d where dt=业务日期 limit 10;

发布业务流程

提交业务流程后,表示任务已进入开发环境。由于开发环境的任务不会自动调度,您需要发布配置完成的任务至生产环境。
说明
  • 发布任务至生产环境前,您需要对代码进行测试,确保其正确性。
  • 如果您使用的是简单模式的工作空间,则没有发布图标。您在提交任务后,单击前往运维图标,进入运维中心页面。
  1. 在业务流程的编辑页面,单击工具栏中的发布图标,进入发布页面。
  2. 选择待发布任务,单击添加到待发布
    添加至待发布
  3. 单击右上角的待发布列表,进入列表后,单击全部打包发布
  4. 确认发布对话框中,单击发布
  5. 在左侧导航栏,单击发布包列表,查看发布状态。

在生产环境运行任务

  1. 任务发布成功后,单击右上角的运维中心
    您也可以进入业务流程的编辑页面,单击工具栏中的前往运维,进入运维中心页面。
  2. 在左侧导航栏,单击周期任务运维 > 周期任务,进入周期任务页面,单击workshop业务流程。
  3. 双击DAG图中的虚节点展开业务流程,右键单击workshop_start节点,选择补数据 > 当前节点及下游节点
    补数据
  4. 选中需要补数据的任务,输入业务日期,单击确定,自动跳转至补数据实例页面。
  5. 单击刷新,直至SQL任务全部运行成功即可。

后续步骤

现在,您已经学习了如何创建SQL任务、如何处理原始日志数据。您可以继续下一个教程,学习如何对开发完成的任务设置数据质量监控,保证任务运行的质量。详情请参见数据质量监控