开发者学堂课程【2020版大数据实战项目之 DMP 广告系统(第五阶段):IP 转换_IP2Region】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/680/detail/11807
IP 转换_IP2Region
内容介绍:
一、ETL 编写
二、IP 怎样进行转换
三、使用 ip2region 查找省市名称
一、ETL 编写
1、前面已经对业务进行了一个简单的学习,也编写了工具类,介绍了整体的架构和工程情况。下面介绍 ETL 的编写,ETL 编写主要介绍转换 IP 地址,通过章节可以学到 IP 怎样转换,整个 ETL 流程是怎样的,这些内容在真正的开发过程中还是比较重要的。ETL 主要进行 IP 转换,主要步骤会分为多个部分学习。
2、第一部分会学习 ETL 的需求和常见的 IP 转换的几种方式。IP 转换可以转换成地理位置信息。第二步要进行具体的代码编写,代码编写结束后要进行简单的结构上的整理,把公用的东西分离出来。下面讲解需求是怎样的,IP 怎样进行转换。
二、IP 怎样进行转换
1、首先,第一部分先学习 IP 转换要用到的工具;其次,学习 IP 转换思路的梳理,梳理之后再学习遇到的挑战和结构,第四点要进行一些参数的配置,第五点介绍 Kudo 的支持库的内容,然后进行具体的编写。
2、需求部分大致就这几个步骤。第一步先看一看 IP 转换工具的介绍。什么是IP转换,需求是怎么样的?如果要进行数据统计 IP 对于我们的意义是非常小的,知道 IP 什么都获取不了,只能得到一串数字。152.60.185.136 这样的 IP 最终可以转化为省市信息,也可以转化为经纬度信息。IP 转换就是让 IP 地址变得更有价值,集中提取地理位置的信息。
3、
进行 IP 转换大致有三种方式,第一种是自己编写,自己编写的优点是不需要学习第三方库,缺点是没有数据结构上的支持,算法倾向于简单的算法,性能相对较低;其次,因为没有上层的封装,使用起来还要写算法或其他的内容,调动起来不是很方便,使用麻烦。所以自己编写并不是一个好的做法,但是也应该了解该怎样编写IP 转换的工具。
4、第一步,要找到 IP 的范围对应省市区这样的数据集,一个数据集有几个列,有很多行。第一个列比如说是456789-466789,这个范围内,一个是开始,一个是结束,这是IP的范围。第二列可能是省,比如说 beijing,第三列是一个市,第四列是一个区,有可能还会有 longitude、latitude,可能还会有一些经纬度的信息,常见的数据集是这样的。
要先找到这样一个数据集,再把数据集读取出来,读取是为了把 IP 进行相应的转换,数据集当中的内容后面几列,比如说省市区的信息,这几列其实不重要,重要的是先看到 IP 范围这一列是怎样进行表示的?IP 范围这一列一般表示大概是 3232235521-3232236521,IP 地址默认下不是这种写法,但是需要把它转为这种数字写法。拿到数据后要看一看,第一个数据集是3232235521-3232236521,第二个数据集是3232235551-3232236561,看新过来的 IP 地址在哪个区间内。如果在第一个区间内就访问对应的省市区信息。
5、接下来有一个非常关键的步骤,就是把 IP 地址转成数字表示法。IP 本质上是点位表示法的二进制数字,这个数字是二进制的点位表示法,192对应的可能是1100 0000,168对应的可能是1010 1000,零对应的可能是0000 0000,一对应的可能是0000 0001,每一串都是四个八位,共三十二位。192.168.0.1 这个 IP 地址本质上是一个32位的二进制数字。这串数字直接写成3232235521这串数字是比较麻烦的,所以他就按照每八位隔一下,0000 0001编成了1,0000 0000编成了0,1010 1000编成了168,1100 0000编成了192,就是按照每八位加一个点,把二进制的长数字分隔开,每个八位生成一个数字,这就是 IP 地址的本质。192.168.0.1 这个 IP 地址肯定可以通过二进制手法还原成一长串数字,拿到这串数字就可以直接计算出它的实际值是多少。拿到实际值的数字就可以在 IP 的数据集中通过二分法进行相应的省市区查找。大家可能认为二分法是一个非常高效的计算方式,但是大家不知道的是在搜索或查询索引的场景下,二分法相对来说是比较低效的。首先,因为二分法没有数据结构上的支持,可以对任何数字进行相应的分割。如果是这样,二分法的性能还是相对较差,但是要用一些 ,其实他的搜索效率还是非常高的。这是第一个缺陷,第二个缺陷是这个数据集是 IP 范围对应省市区的信息,即使对应的有经纬度信息,但是不够准确。IP 范围没有办法进行特别准确的查找,所以自己编写的这种方式,大家知道怎么即可,能了解大致的思路,可以做出来即可。
6、第二种方式是使用第三方库,在 IP 转换的领域下,有很多第三方库。其中比较常见的有三个,第一个是 GeoLite,GeoLite 是一个非常知名的国外的项目。第二个是纯真数据库,纯真数据库是腾讯开源的,国内数据会更加完整。第三个是 ip2region,这是一个后起之秀,在马云上进行开源的。这三个库是较为常见的,本课程采用两个,使用 ip2region 获取省市区信息,然后使用 GeoLite 获取经纬度信息。为什么要这样做呢?原因是 GeoLite 没有办法获取省市信息,获取的省市信息是 PEA,ip2 region 也有一个缺点,没有办法获取经纬度信息,所以这两个框架结合起来一起使用比较方便。使用第三方库的优点是速度快,像 GeoLite 和 ip2region 其实是有很多数据结构上的支持,有很多这些相关的支持,是比较厉害的。其次使用起来不麻烦,有上层封装,用起来比较舒服,第三方一般会提供数据集,数据集会定时更新,更精准。第四点是对于公用的功能是已经做好的。缺点是使用任何第三方的工具都需要学习成本,会有一些不太好理解的地方,这是他的优缺点。本课程会采用第三方库,第三方库要比自己编写的好。
三、使用 ip2region 查找省市名称
1、下面可以用 ip2 region 这个工具来查找省市名称。先对比一下这三个工具,GeoLite 有数据结构的支持,所以它的性能相对来说是较好的。纯真库是需要自己编写代码的,没有数据结构的支持。ip2region 也有数据结构的支持,所以 GeoLite 和 ip2region 性能都很好。
但是 GeoLite 有一个问题,它转换的省市信息当中没有中文,只有拼音,但是 ip2region 是有中文的。想把拼音转换成中文还是有一些困难的。
2、接下来引入 ip2region,进行实际的测试。第一步把
org. lionsoul
ip2region
1.7.2
导入到工程中,第二步,进行具体的代码编写。
val searcher= new DbSearcher(new DbConfig(),“dataset/
ip2region. db”)
val data=searcher.btreeSearch(ip)
println(data.getRegion)
到时候创建一个新的测试类,在测试类当中测试 ip2region 的使用。还有一步需要把它自带的数据集叫做 ip2region.db ,复制到工程的目录下。总共三步,第一步复制数据集,第二步导入 Maven 依赖,第三步使用 ip2region。
3、先进到 files 目录里,有一个叫做 ip2region.db 文件,复制,打开 IDEA。
然后创建一个新的 director 目录,名称叫做 dataset 。
然后把 ip2region 数据集导入到 dataset ,就是以 db 结尾的数据集。第二步,复制 Maven 依赖,回到 IDEA 中,打开 pom.xml 文件,在这个文件当中另起一行导入复制的内容。
org. lionsoul
ip2region
1.7.2
需要等待它的加载,如果这个地方一直加载不出来,可以点击 Maven,选择 compile
等待 Maver 的执行,执行完成就可以加载出来,在执行过程会进行下载。
这个时候已经运行完毕。
依赖的地方也已经加载完毕。
org.lionsoul
ip2region
1.7.2
4、进入到 src 下的 main 的 scala 里,找到 itcast,在 test 当中创建一个新的 scala class,叫做 IP Test。
在 IP Test 当中编写第一个方法,使用 junit 进行相应的编写。第一个叫做 ip2region,在这个方法当中,第一步还需要创建一个 searcher,Db Searcher 当中接收两个参数,第一个参数是 config 。看一下 Db searcher 的类叫什么名字,点击 Db Searcher ,找到 Db Searcher 构造,找到 DbConfig,里面什么都不用设置,后面跟上一个参数,名字叫做 dbFile。要把数据库文件的位置设置在这个地方,在 dataset 下叫做 ip2region.db。Searcher 已经创建出来就可以进行相应的 Searcher,可以直接使用一个叫做 btree search 的方法,来进行相应的搜索。大家通过方法名可以看到他是有一个数据结构的,btree 进行搜索的时候,检索效率是非常高的,上传一个 ip 值,是121.76.98.134,这个时候就能搜索到 region 结果。获取到 region 对象以后发现是 datablock ,datablock 还不能直接使用,再往下走一级 getRegion 。
@Test
def ip2Region(): Unit = {
val searcher= new DbSearcher(new DbConfig(), dbFile= "databaset/ip2region. db")
val region=searcher. btreesearch(ip="121.76.98.134")
.getRegion
println(region)
}
}
5、接下来 println 打印 region ,然后运行。整个方式还是比较简单的,创建searcher,使用 searcher.btreeSearch 进行搜索。这个时候结果已经出来了,对应的是中国|0|上海|上海市|有线通,0是区域的标志。
如果想知道是哪个省哪个市的,就可以按照竖杠(|)通道符号进行切分,第零项是国家,第一项是标识,第二项是省,第三项是市,直接取2和3就可以获取整个结果。这是地理位置显示信息的获取,也就是省市信息的获取,通过 IP可以转换地理位置信息,这是第一步。再回到笔记当中,看看经纬度的信息怎样使用,这个时候有一个工具叫做 GeoLite ,GeoLite 和 ip2region 性能都非常好,GeoLite 也带了自己的数据库,可以使用 GeoLite 找到某一个 IP 地址的经纬度信息,会更细致。