本文为您介绍如何使用MaxCompute分析IP来源,包括下载、上传IP地址库数据、编写UDF函数和编写SQL四个步骤。
前提条件
-
在DataWorks上完成创建业务流程,本例使用DataWorks简单模式。详情请参见 创建业务流程 。
背景信息
淘宝IP地址库的查询接口为IP地址字符串,使用示例如下。
在MaxCompute中禁止使用HTTP请求,因此目前可以通过如下三种方式实现在MaxCompute中查询IP:
-
用SQL将数据下载至本地,再发起HTTP请求查询。
说明效率低下,且淘宝IP库查询频率需要小于10 QPS,否则拒绝请求。
-
下载IP地址库至本地,再进行查询。
说明效率低下,且不利于数据仓库等产品分析使用。
-
将IP地址库定期维护上传至MaxCompute,进行连接查询。
说明比较高效,但是IP地址库需要自己定期维护。
下载IP地址库数据
-
获取地址库数据。本文提供示例IP地址库数据 UTF-8格式的不完整的地址库demo 。
-
下载示例地址库数据至本地,示例如下。
示例数据说明如下:
-
数据格式为UTF-8。
-
前四个数据是IP地址的起始地址与结束地址。前两个是十进制整数形式,后两个是点分形式。IP地址段为整数形式,以便计算IP是否属于这个网段。
说明如果您需要使用自己的IP地址,请自行下载IP地址库 ,具体的下载地址和使用方式请参见 MaxCompute中实现IP地址归属地转换 。
-
上传IP地址库数据
-
在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 );
-
执行如下Tunnel命令,上传本地示例IP地址库数据至表 ipresource 。
odps@ workshop_demo>tunnel upload D:/ipdata.txt.utf8 ipresource;
上述命令中, D:/ipdata.txt.utf8 为IP地址库数据本地存放路径。更多命令说明请参见 Tunnel命令 。
您可以执行如下语句验证数据是否上传成功。
--查询表中数据条数。 select count(*) from ipresource;
-
执行如下SQL语句,查看表 ipresource 前10条的样本数据。
select * from ipresource limit 10;
返回结果如下。
编写UDF函数
通过编写Python UDF,将点号分割的IP地址转化为整数类型的IP地址,本示例使用DataWorks的PyODPS完成。详情请参见 开发PyODPS 2任务 。
-
登录 DataWorks控制台 ,切换至目标地域后,单击左侧导航栏的 ,在下拉框中选择对应工作空间后单击 进入数据服务 。
-
新建Python资源。
-
右键单击目标业务流程,选择 。
-
在 新建资源 对话框中,填写资源名称,并勾选 上传为ODPS资源 ,单击 新建 。
-
在Python资源中输入如下代码。
from odps.udf import annotate @annotate("string->bigint") class ipint(object): def evaluate(self, ip): return reduce(lambda x, y: (x << 8) + y, map(int, ip.split('.'))) except: return 0
-
单击 图标,提交资源。
-
-
新建函数。
-
右键单击目标业务流程,选择 。
-
在 新建函数 对话框中,输入名称,单击 新建 。
说明如果数据开发中绑定了多个MaxCompute引擎,则选择本次需要创建函数的MaxCompute 引擎实例 。
-
在函数的编辑页面,配置各项参数。
参数
描述
函数类型
选择函数类型,包括 数学运算函数 、 聚合函数 、 字符串处理函数 、 日期函数 、 窗口函数 和 其他函数 。
MaxCompute引擎实例
默认不可以修改。
函数名
UDF函数名,即SQL中引用该函数所使用的名称。需要全局唯一,且注册函数后不支持修改。
责任人
默认显示。
类名
实现UDF的主类名,必填。
说明当资源类型为Python时,类名格式为 Python资源名称.类名 (资源名称中的 .py 无需填写)。
资源列表
完整的文件名称,支持模糊匹配查找本工作空间中已添加的资源,必填。
多个文件之间,使用英文逗号(,)分隔。
描述
针对当前UDF作用的简单描述。
命令格式
该UDF的具体使用方法示例,例如
test
。参数说明
支持输入的参数类型以及返回参数类型的具体说明。
返回值
返回值,例如1,非必填项。
示例
函数中的示例,非必填项。
-
-
单击工具栏中的 图标,保存函数。
-
提交函数。
-
单击工具栏中的 图标。
-
在 提交新版本 对话框中,输入 备注 。
-
单击 确认 。
-
在SQL中使用UDF函数分析IP来源
-
右键单击业务流程,选择 。
-
在 新建节点 对话框中输入节点名称,并单击 确认 。
-
在ODPS SQL节点编辑页面,输入如下语句。
select * from ipresource WHERE ipint('192.0.2.0') >= start_ip AND ipint('192.0.2.0') <= end_ip
-
单击 图标运行代码。
-
您可以在 运行日志 查看运行结果。