说明:日常业务经常涉及到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转地域使用复杂度