spark案例:IP范围重复去重问题解决

两个IP范围:

10.100.1.1-10.100.1.254
10.100.1.1-10.100.2.62

转换成  10.100.1.1-10.100.1.254

或者两个IP范围:

10.100.1.100-10.100.1.150
10.100.1.120-10.100.1.250

转换成 10.100.1.100-10.100.1.250


IP文件部分:

10.1.0.0-10.1.255.255
10.1.0.130
10.1.0.14
10.1.1.92
10.1.114.114
10.1.14.0-10.1.14.255
10.1.14.23-10.1.14.27
10.1.195.0-10.1.195.255
10.1.2.100
10.131.12.0-10.131.12.255
10.131.120.0-10.131.127.255
10.131.128.0-10.131.255.255
10.131.13.0-10.131.13.31
10.131.13.128-10.131.13.255
10.131.13.32-10.131.13.63
10.131.13.64-10.131.13.95
10.131.13.96-10.131.13.127
10.131.14.0-10.131.14.31
10.131.14.128-10.131.14.255
10.131.14.32-10.131.14.63
10.131.14.64-10.131.14.95
10.131.14.96-10.131.14.127
10.131.15.0-10.131.15.255
10.131.16.0-10.131.16.255
10.131.17.0-10.131.17.127
10.131.17.128-10.131.17.159
10.131.17.160-10.131.17.191
10.131.17.192-10.131.17.255
10.131.18.0-10.131.18.127
10.131.18.128-10.131.18.255
10.131.19.0-10.131.19.255
10.131.2.0-10.131.2.255
10.131.20.0-10.131.21.255
10.131.22.0-10.131.22.255
10.131.23.0-10.131.23.127
10.131.23.128-10.131.23.255
10.131.24.0-10.131.24.127
10.131.24.128-10.131.24.255
10.131.25.0-10.131.25.255
10.131.26.0-10.131.28.255
10.131.29.0-10.131.33.255
10.131.3.0-10.131.3.255
10.131.34.0-10.131.39.255
10.131.4.0-10.131.4.255
10.131.40.0-10.131.45.255
10.131.46.0-10.131.51.255
10.131.5.0-10.131.5.127
10.131.5.128-10.131.5.255
10.131.52.0-10.131.57.255
10.131.58.0-10.131.66.255
10.131.6.0-10.131.6.127
10.131.6.128-10.131.6.255
10.131.67.0-10.131.73.255
10.131.7.0-10.131.7.127
10.131.7.128-10.131.7.255
10.131.74.0-10.131.82.255
10.131.8.0-10.131.8.63
10.131.8.128-10.131.8.255
10.131.8.64-10.131.8.95
10.131.8.96-10.131.8.127
10.131.83.0-10.131.89.255
10.131.9.0-10.131.9.255
10.131.90.0-10.131.96.255
10.131.97.0-10.131.102.255
10.132.0.0-10.132.7.255
10.132.102.0-10.132.107.255
10.132.108.0-10.132.113.255
10.132.114.0-10.132.119.255
10.132.120.0-10.132.123.255
10.132.124.0-10.132.127.255
10.132.128.0-10.132.129.255
10.132.132.0-10.132.137.255
10.132.138.0-10.132.138.255
10.132.139.0-10.132.143.255
10.132.144.0-10.132.146.255
10.132.148.0-10.132.148.255
10.132.150.0-10.132.153.255
10.132.154.0-10.132.154.255
10.132.156.0-10.132.156.255
10.132.157.0-10.132.158.255
10.132.159.0-10.132.165.255
10.132.16.0-10.132.19.255
10.49.53.0-10.49.53.255
10.49.54.0-10.49.54.255
10.49.55.0-10.49.55.255
10.49.56.0-10.49.56.255
10.49.57.0-10.49.57.255
10.49.58.0-10.49.58.255
10.49.59.0-10.49.59.255
10.49.6.0-10.49.6.255
10.49.60.0-10.49.60.255
10.49.61.0-10.49.61.255
10.49.62.0-10.49.62.255
10.49.63.0-10.49.63.255
10.49.64.0-10.49.64.255
10.49.65.0-10.49.65.255
10.49.66.0-10.49.66.255

Scala代码:

package com.doctorai.dpnice.testdemo

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession

/**
  * @author DPn!ce   date 2018 08 10 下午 1:47
  */
object IPIntersection extends App {
  val sparkSession = SparkSession.builder.
    master("local[1]")
    .appName("IPIntersection")
    .getOrCreate()
  val sc = sparkSession.sparkContext
  private val IPFile: RDD[String] = sc.textFile("C:\\Users\\Administrator\\Documents\\WeChat Files\\DPnnnnnnnnnnnnnnnice\\Files\\ip.txt")
  IPFile.flatMap(_.split("-")).map(ip => {
    val strings = ip.split("\\.")
    val sb = new StringBuilder()
    val key = sb.append(strings(0)).append(".").append(strings(1)).append(".").append(strings(2))
    (key.toString(), strings(3))
  }).reduceByKey((x, y) => {
    var result = ""
    if (x.contains("-")) {
      val xMin = Integer.parseInt(x.split("-")(0))
      val xMax = Integer.parseInt(x.split("-")(1))
      val i = Integer.parseInt(y)
      if (i < xMin) {
        result = i + "-" + xMax
      } else if (i > xMax) {
        result = xMin + "-" + i
      } else {
        result = x
      }
    } else {
      result = x + "-" + y
    }
    result
  }).map(t => {
    val sb = new StringBuilder
    if (t._2.contains("-")) {
      val f = t._2.split("-")(0)
      val l = t._2.split("-")(1)
      sb.append(t._1).append(".").append(f).append("-").append(t._1).append(".").append(l)
    } else {
      sb.append(t._1).append(".").append(t._2)
    }
    sb.toString()
  }).saveAsTextFile("C:\\Users\\Administrator\\Desktop\\out")
}

其实就是将每个范围的前三段 为 key 最后一段 作为 value 进行 reduceByKey ,将小的放在左大的放在右。hin简单。

你可能感兴趣的:(spark)