根据业务不同,一般都是需要自定义udf来操作
package Test
import Test.SQLIIpLocation1.ip2Long
import org.apache.spark.broadcast.Broadcast
import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}
/**
* 使用SparkSql实现access中的ip与ip规则库的关联
优点:不需要提前拿到全量的ip地址库,可以采用这种自定义函数的方式读取关系型数据库、Nosql、第三方Api等等
*/
object SQLIpLocation2 {
/**
* 定义一个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:Array[(Long,Long,String)],ip:Long):Int={
//定义一个初始值
var low =0
//定义一个末位置
var high =lines.length-1
while(low<= high){
val middle =(low +high) /2
if((ip>=lines(midd