zoukankan      html  css  js  c++  java
  • spark练习--由IP得到所在地

      今天我们就来介绍,如何根据一个IP来求出这个IP所在的地址是什么,首先我们如果要做这个内容,那么我们要有一个IP地址的所在地字典,这个我们可以在网上购买,形如:

      

    1.0.1.0|1.0.3.255|16777472|16778239|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
    1.0.8.0|1.0.15.255|16779264|16781311|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
    1.0.32.0|1.0.63.255|16785408|16793599|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
    1.1.0.0|1.1.0.255|16842752|16843007|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302

       这个只是其中的一个小部分,我们可以来介绍一下这个如何查看,当我如果获取一个IP,那我们首先先把这个IP转换成为一个Long型的值,其中的转换方法,后文会有介绍,然后我们在看上面的数据,以第一条数据为例

      1.0.1.0|1.0.3.255|16777472|16778239|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302

      这个以'|'来作为分隔符,其中的第二三个数字分别为:16777472,16778239这两个数字,这个表示如果我们把上面的IP转换成为Long值的情况,如果这个long的大小在16777472与16778239之间,那我们就可以说,这个IP是中国福建的电信,好了,解释完成之后,我们就可以开始写代码了

    package cn.wj.spark.day06
    
    import java.io.{BufferedReader, FileInputStream, InputStreamReader}
    
    import scala.collection.mutable.ArrayBuffer
    
    /**
      * Created by WJ on 2017/1/4.
      */
    object IPLocationDemo_2 {
    
      // 将IP转换成为Long值
      def ip2Long(ip:String):Long ={
        val fragments = ip.split("[.]")
        var ipNum = 0L
        for(i <- 0 until fragments.length){
          ipNum = fragments(i).toLong | ipNum << 8L       //8进制变为10进制
        }
        ipNum
      }
       //进行二分法的查找,这个的前提是顺序已经是排序过的了
      def binarySearch(lines: ArrayBuffer[String], ip: Long) : Int = {
        var low = 0
        var high = lines.length - 1
        while (low <= high) {
          val middle = (low + high) / 2
          if ((ip >= lines(middle).split("\|")(2).toLong) && (ip <= lines(middle).split("\|")(3).toLong))
            return middle
          if (ip < lines(middle).split("\|")(2).toLong)
            high = middle - 1
          else {
            low = middle + 1
          }
        }
        -1
      }
    
      //从一个文件里面读取数据
      def readData(path:String) = {
        val br = new BufferedReader(new InputStreamReader(new FileInputStream(path)))
        var s:String  = null
        var flag = true
        var lines = ArrayBuffer[String]()
        while(flag){
          s = br.readLine()
          if(s != null)
            lines += s
          else
            flag = false
        }
        lines
      }
    
      def main(args: Array[String]): Unit = {
        val ip ="118.144.130.10"
        val ipNum = ip2Long(ip)
        println(ipNum)
        val lines = readData("e://Test/ip.txt")
        val index = binarySearch(lines,ipNum)
        println(lines(index))
      }
    }

      

  • 相关阅读:
    获取DIV与浏览器顶部相聚一定位置之后移动DIV
    CSS定位小技巧
    jquery动态样式操作
    Python学习笔记1
    KNN算法的感受 2
    KNN算法的感受 1
    Matplotlib安装感想
    安装numpy只需一步简单的方法
    Ubuntu学习笔记3-图书知识点总结
    Hadoop源码如何查看
  • 原文地址:https://www.cnblogs.com/wnbahmbb/p/6250099.html
Copyright © 2011-2022 走看看