本文为您介绍如何使用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地址库
上传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函数
登录DataWorks控制台,单击左侧导航栏的 ,在下拉框中选择对应工作空间后单击进入数据开发。
新建Python资源。
右键单击目标业务流程,选择 。
在新建资源对话框中,填写资源名称,并勾选上传为ODPS资源,单击新建。
在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
单击图标,提交资源。
新建函数。
右键单击目标业务流程,选择 。
在新建函数对话框中,输入名称,单击新建。
说明如果数据开发中绑定了多个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
单击图标运行代码。
您可以在运行日志查看运行结果。