使用MaxCompute分析IP来源最佳实践

本文为您介绍如何使用MaxCompute分析IP来源,包括下载、上传IP地址库数据、编写UDF函数和编写SQL四个步骤。

前提条件

背景信息

淘宝IP地址库的查询接口为IP地址字符串,使用示例如下。查询接口

在MaxCompute中禁止使用HTTP请求,因此目前可以通过如下三种方式实现在MaxCompute中查询IP:

  • 用SQL将数据下载至本地,再发起HTTP请求查询。

    说明

    效率低下,且淘宝IP库查询频率需要小于10 QPS,否则拒绝请求。

  • 下载IP地址库至本地,再进行查询。

    说明

    效率低下,且不利于数据仓库等产品分析使用。

  • 将IP地址库定期维护上传至MaxCompute,进行连接查询。

    说明

    比较高效,但是IP地址库需要自己定期维护。

下载IP地址库数据

  1. 获取地址库数据。本文提供示例IP地址库数据UTF-8格式的不完整的地址库demo

  2. 下载示例地址库数据至本地,示例如下。

    image

    示例数据说明如下:

    • 数据格式为UTF-8。

    • 前四个数据是IP地址的起始地址与结束地址。前两个是十进制整数形式,后两个是点分形式。IP地址段为整数形式,以便计算IP是否属于这个网段。

    说明

    如果您需要使用自己的IP地址,请自行下载IP地址库,具体的下载地址和使用方式请参见MaxCompute中实现IP地址归属地转换

上传IP地址库数据

  1. 在MaxCompute客户端执行如下语句,创建表ipresource存放IP地址库数据。

    DROP TABLE IF EXISTS ipresource ;
    
    CREATE TABLE IF NOT EXISTS ipresource 
    (
        start_ip BIGINT
        ,end_ip BIGINT
        ,start_ip_arg string
        ,end_ip_arg string
        ,country STRING
        ,area STRING
        ,city STRING
        ,county STRING
        ,isp STRING
    );
  2. 执行如下Tunnel命令,上传本地示例IP地址库数据至表ipresource

    odps@ workshop_demo>tunnel upload D:/ipdata.txt.utf8 ipresource;

    上述命令中,D:/ipdata.txt.utf8为IP地址库数据本地存放路径。更多命令说明请参见Tunnel命令

    您可以执行如下语句验证数据是否上传成功。

    --查询表中数据条数。
    select count(*) from ipresource;
  3. 执行如下SQL语句,查看表ipresource前10条的样本数据。

    select * from ipresource limit 10;

    返回结果如下。

    image

编写UDF函数

通过编写Python UDF,将点号分割的IP地址转化为整数类型的IP地址,本示例使用DataWorks的PyODPS完成。详情请参见开发PyODPS 2任务

  1. 登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的数据开发与治理 > 数据服务,在下拉框中选择对应工作空间后单击进入数据服务

  2. 新建Python资源。

    1. 右键单击目标业务流程,选择新建资源 > MaxCompute > Python

    2. 新建资源对话框中,填写资源名称,并勾选上传为ODPS资源,单击新建

    3. 在Python资源中输入如下代码。

      from odps.udf import annotate
      @annotate("string->bigint")
      class ipint(object):
          def evaluate(self, ip):
              try:
                  return reduce(lambda x, y: (x << 8) + y, map(int, ip.split('.')))
              except:
                  return 0
    4. 单击image.png图标,提交资源。

  3. 新建函数。

    1. 右键单击目标业务流程,选择新建函数 > MaxCompute > 函数

    2. 新建函数对话框中,输入名称,单击新建

      说明

      如果数据开发中绑定了多个MaxCompute引擎,则选择本次需要创建函数的MaxCompute引擎实例

    3. 在函数的编辑页面,配置各项参数。

      **

      参数

      描述

      函数类型

      选择函数类型,包括数学运算函数聚合函数字符串处理函数日期函数窗口函数其他函数

      MaxCompute引擎实例

      默认不可以修改。

      函数名

      UDF函数名,即SQL中引用该函数所使用的名称。需要全局唯一,且注册函数后不支持修改。

      责任人

      默认显示。

      类名

      实现UDF的主类名,必填。

      说明

      当资源类型为Python时,类名格式为Python资源名称.类名(资源名称中的.py无需填写)。

      资源列表

      完整的文件名称,支持模糊匹配查找本工作空间中已添加的资源,必填。

      多个文件之间,使用英文逗号(,)分隔。

      描述

      针对当前UDF作用的简单描述。

      命令格式

      该UDF的具体使用方法示例,例如test

      参数说明

      支持输入的参数类型以及返回参数类型的具体说明。

      返回值

      返回值,例如1,非必填项。

      示例

      函数中的示例,非必填项。

  4. 单击工具栏中的保存图标,保存函数。

  5. 提交函数。

    1. 单击工具栏中的提交图标。

    2. 提交新版本对话框中,输入备注

    3. 单击确认

在SQL中使用UDF函数分析IP来源

  1. 右键单击业务流程,选择新建 > MaxCompute > ODPS SQL

  2. 新建节点对话框中输入节点名称,并单击确认

  3. 在ODPS SQL节点编辑页面,输入如下语句。

    select * from ipresource
    WHERE ipint('192.0.2.0') >= start_ip
    AND ipint('192.0.2.0') <= end_ip
  4. 单击**图标运行代码。

  5. 您可以在运行日志查看运行结果。