说明:日常业务经常涉及到ip映射地域的统计,有一定的使用复杂度,本文结合业界几种现状,做一次综合测试评估。

什么是ip地址库

通过ip地址获取用户地理位置信息,一般包括的信息由国家、区域(省/州)、城市、街道、经纬度、ISP提供商等信息。

质量评价标准

  • 粒度。 ip地址库中IP(段)对应的其他信息的精确程度。例如精确到国家还是市、县?不同的应用对IP地址库的粒度要求是不同的。但就IP地址库的自身评价来说,粒度越细,IP地址库的价值越大。
  • 准确度。 提供信息的准确程度,准确度越高,IP地址库的价值越大。
  • 覆盖度。 特定集合,IP地址库覆盖的比例。例如中国IPv4有3.1亿,某IP地址库中含有中国的IP地址数为2.8亿,覆盖度为90%,覆盖度越高,IP地址库越好。
  • 是否有人维护
  • 更新频率

国内外IP地址数据库

国内比较有名的是”纯真“数据库,以及最近更出来的17MON,国外常用的MaxMind、ip2location。

国内百度、淘宝、新浪对外也提供有api接口,可以获取用户经纬度,但是存在访问次数限制。

一般有人维护的,都是收费的,质量、干净、准确程度更好些。


 

质量

粒度

准确度

维护

经纬度

收费

吐槽

公司




---


---

地址库太旧

纯真







数据比较杂

17MON






暂无

只能精确到省份

MaxMind






免费/收费

中国地区,以汉语拼音显示


如下从本公司(ip库)、17MON、MaxMind(免费版)做统计查询比较。

综合来说:推荐MaxMind wiki、文档齐全,也有相应的API。

数据来源,从iplog抓取2500万条用户记录,统计用户uv


 

耗时

uv

公司

101.3s  

841974 

17MON

92.3s  

1152597 

MaxMInd

170.0s  

1391777 


测试sql语句:

公司:


hive -e "create temporary function ip_to_city as 'com.renren.dolphin.udf.IpToArea';use acorn_3g;select count(distinct id) from  test_iplog where  get_json_object(ip_to_city(ip),'$.province') = '北京市';"


17MON:


hive -e "use acorn_3g;add FILE ./17monipdb.dat;add JAR ./HiveUDFs-1.0-SNAPSHOT.jar;create temporary function ip_to_mon as 'cn.gxnu.ipdata.MonIp';select count(distinct id) from test_iplog where split(ip_to_mon(ip),'\t')[1] = '北京';"


MaxMind


hive -e "add FILE ./GeoLiteCity.dat;add JAR ./HiveUDFs-1.0-SNAPSHOT.jar;CREATE TEMPORARY FUNCTION geoip as 'net.petrabarus.hiveudfs.GeoIP'; ;select count(distinct id) from acorn_3g.test_iplog where  geoip(cast (ip_num as bigint),'REGION_NAME','./GeoLiteCity.dat')='Beijing';"


新建hive函数


名称

说明

参数

返回值

iptolog

IP地址转换为long型

string

long

longtoip

long转变为ip地址类型

long

string

iptocountry

返回国家名称

ip

string

iptoprovince 

返回省份名称

ip

string

iptocity

返回城市名称

ip

string


根据以往业务,打算开发以上几个函数,内置到hive中,减轻大家ip转地域使用复杂度