1 需求
根据ip规则数据,计算出给定日志中ip地址对应的省份信息
2 思路分析
(1) 读取Ip规则数据,整理数据,切分需要的字段,并收集到driver端(collect)
(2)将driver端准备好的数据广播到Executor中,返回一个广播变量的引用(在driver端)
(3)读取访问日志数据,获取访问日志中的Ip ,并用定义好的工具类,将ip转成十进制
(4)通过广播变量的引用,可以获取到事先广播到Executor中的数据
(5)使用二分查找获取省份名,并和1组合, 聚合获取省份的访问量
3 代码实现
自定义工具类 IpUtils: (1)将Ip转为十进制 (2)使用二分查找获取对应的省份
/**
* 将IP地址转成十进制
*
* @param ip
* @return
*/
def ip2Long(ip: String): Long = {
val fragments = ip.split("[.]")
var ipNum = 0L
for (i <- 0 until fragments.length) {
ipNum = fragments(i).toLong | ipNum << 8L
}
ipNum
}
/**
* 二分法查找
*
* @param lines
* @param ip
* @return
*/
def binarySearch(lines: ArrayBuffer[(Long,