使用MaxCompute分析IP來(lái)源最佳實(shí)踐
本文為您介紹如何使用MaxCompute分析IP來(lái)源,包括下載、上傳IP地址庫(kù)數(shù)據(jù)、編寫(xiě)UDF函數(shù)和編寫(xiě)SQL四個(gè)步驟。
前提條件
在DataWorks上完成創(chuàng)建業(yè)務(wù)流程,本例使用DataWorks簡(jiǎn)單模式。詳情請(qǐng)參見(jiàn)創(chuàng)建業(yè)務(wù)流程。
背景信息
淘寶IP地址庫(kù)的查詢接口為IP地址字符串,使用示例如下。
在MaxCompute中禁止使用HTTP請(qǐng)求,因此目前可以通過(guò)如下三種方式實(shí)現(xiàn)在MaxCompute中查詢IP:
用SQL將數(shù)據(jù)下載至本地,再發(fā)起HTTP請(qǐng)求查詢。
說(shuō)明效率低下,且淘寶IP庫(kù)查詢頻率需要小于10 QPS,否則拒絕請(qǐng)求。
下載IP地址庫(kù)至本地,再進(jìn)行查詢。
說(shuō)明效率低下,且不利于數(shù)據(jù)倉(cāng)庫(kù)等產(chǎn)品分析使用。
將IP地址庫(kù)定期維護(hù)上傳至MaxCompute,進(jìn)行連接查詢。
說(shuō)明比較高效,但是IP地址庫(kù)需要自己定期維護(hù)。
下載IP地址庫(kù)數(shù)據(jù)
獲取地址庫(kù)數(shù)據(jù)。本文提供示例IP地址庫(kù)數(shù)據(jù)UTF-8格式的不完整的地址庫(kù)demo。
下載示例地址庫(kù)數(shù)據(jù)至本地,示例如下。
示例數(shù)據(jù)說(shuō)明如下:
數(shù)據(jù)格式為UTF-8。
前四個(gè)數(shù)據(jù)是IP地址的起始地址與結(jié)束地址。前兩個(gè)是十進(jìn)制整數(shù)形式,后兩個(gè)是點(diǎn)分形式。IP地址段為整數(shù)形式,以便計(jì)算IP是否屬于這個(gè)網(wǎng)段。
說(shuō)明如果您需要使用自己的IP地址,請(qǐng)自行下載IP地址庫(kù),具體的下載地址和使用方式請(qǐng)參見(jiàn)MaxCompute中實(shí)現(xiàn)IP地址歸屬地轉(zhuǎn)換。
上傳IP地址庫(kù)數(shù)據(jù)
在MaxCompute客戶端執(zhí)行如下語(yǔ)句,創(chuàng)建表ipresource存放IP地址庫(kù)數(shù)據(jù)。
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 );
執(zhí)行如下Tunnel命令,上傳本地示例IP地址庫(kù)數(shù)據(jù)至表ipresource。
odps@ workshop_demo>tunnel upload D:/ipdata.txt.utf8 ipresource;
上述命令中,D:/ipdata.txt.utf8為IP地址庫(kù)數(shù)據(jù)本地存放路徑。更多命令說(shuō)明請(qǐng)參見(jiàn)Tunnel命令。
您可以執(zhí)行如下語(yǔ)句驗(yàn)證數(shù)據(jù)是否上傳成功。
--查詢表中數(shù)據(jù)條數(shù)。 select count(*) from ipresource;
執(zhí)行如下SQL語(yǔ)句,查看表ipresource前10條的樣本數(shù)據(jù)。
select * from ipresource limit 10;
返回結(jié)果如下。
編寫(xiě)UDF函數(shù)
通過(guò)編寫(xiě)Python UDF,將點(diǎn)號(hào)分割的IP地址轉(zhuǎn)化為整數(shù)類型的IP地址,本示例使用DataWorks的PyODPS完成。詳情請(qǐng)參見(jiàn)開(kāi)發(fā)PyODPS 2任務(wù)。
登錄DataWorks控制臺(tái),切換至目標(biāo)地域后,單擊左側(cè)導(dǎo)航欄的 ,在下拉框中選擇對(duì)應(yīng)工作空間后單擊進(jìn)入數(shù)據(jù)服務(wù)。
新建Python資源。
右鍵單擊目標(biāo)業(yè)務(wù)流程,選擇 。
在新建資源對(duì)話框中,填寫(xiě)資源名稱,并勾選上傳為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
單擊圖標(biāo),提交資源。
新建函數(shù)。
右鍵單擊目標(biāo)業(yè)務(wù)流程,選擇 。
在新建函數(shù)對(duì)話框中,輸入名稱,單擊新建。
說(shuō)明如果數(shù)據(jù)開(kāi)發(fā)中綁定了多個(gè)MaxCompute引擎,則選擇本次需要?jiǎng)?chuàng)建函數(shù)的MaxCompute引擎實(shí)例。
在函數(shù)的編輯頁(yè)面,配置各項(xiàng)參數(shù)。
參數(shù)
描述
函數(shù)類型
選擇函數(shù)類型,包括數(shù)學(xué)運(yùn)算函數(shù)、聚合函數(shù)、字符串處理函數(shù)、日期函數(shù)、窗口函數(shù)和其他函數(shù)。
MaxCompute引擎實(shí)例
默認(rèn)不可以修改。
函數(shù)名
UDF函數(shù)名,即SQL中引用該函數(shù)所使用的名稱。需要全局唯一,且注冊(cè)函數(shù)后不支持修改。
責(zé)任人
默認(rèn)顯示。
類名
實(shí)現(xiàn)UDF的主類名,必填。
說(shuō)明當(dāng)資源類型為Python時(shí),類名格式為Python資源名稱.類名(資源名稱中的.py無(wú)需填寫(xiě))。
資源列表
完整的文件名稱,支持模糊匹配查找本工作空間中已添加的資源,必填。
多個(gè)文件之間,使用英文逗號(hào)(,)分隔。
描述
針對(duì)當(dāng)前UDF作用的簡(jiǎn)單描述。
命令格式
該UDF的具體使用方法示例,例如
test
。參數(shù)說(shuō)明
支持輸入的參數(shù)類型以及返回參數(shù)類型的具體說(shuō)明。
返回值
返回值,例如1,非必填項(xiàng)。
示例
函數(shù)中的示例,非必填項(xiàng)。
單擊工具欄中的圖標(biāo),保存函數(shù)。
提交函數(shù)。
單擊工具欄中的圖標(biāo)。
在提交新版本對(duì)話框中,輸入備注。
單擊確認(rèn)。
在SQL中使用UDF函數(shù)分析IP來(lái)源
右鍵單擊業(yè)務(wù)流程,選擇 。
在新建節(jié)點(diǎn)對(duì)話框中輸入節(jié)點(diǎn)名稱,并單擊確認(rèn)。
在ODPS SQL節(jié)點(diǎn)編輯頁(yè)面,輸入如下語(yǔ)句。
select * from ipresource WHERE ipint('192.0.2.0') >= start_ip AND ipint('192.0.2.0') <= end_ip
單擊圖標(biāo)運(yùn)行代碼。
您可以在運(yùn)行日志查看運(yùn)行結(jié)果。