使用SparkSQL实现根据ip地址计算归属地一

之前使用过RDD实现过这个案例,如果不知道可以去参考我写的博文,这里要实现的就是在之前那个基础上进行修改的,具体实现思路就是将ip地址规则和访问日志文件中的数据进行整理然后转换成DataFrame之后注册成表,然后写Sql语句进行Join操作

具体代码实现:

package cn.ysjh0014.SparkSql


import cn.ysjh0014.TestIp
import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}

object IpLocationSQL {

  def main(args: Array[String]): Unit = {

    val session: SparkSession = SparkSession.builder().appName("IpLocationSQL").master("local[4]").getOrCreate()

    //取到HDFS中的ip规则
    import session.implicits._
    val rulesLines: Dataset[String] = session.read.textFile(args(0))
    //整理ip规则数据
    val Dept: Dataset[(Long, Long, String)] = rulesLines.map(line => {
      val fields = line.split("[|]")
      val startNum = fields(2).toLong
      val endNum = fields(3).toLong
      val province = fields(6)
      (startNum, endNum, province)
    })
    val ipRulesRdd: DataFrame = Dept.toDF("startNum","endNum","province")


    //创建RDD,读取访问日志
     val accessLines: Dataset[String] = session.read.textFile(args(1))

    //整理数据
    val result : Dataset[Long] = accessLines.map(log => {
      //将log日志的每一行进行切分
      val fields = log.split("[|]")
      val ip = fields(1)
      //将ip转换成十进制
      val ipNum = TestIp.ip2Long(ip)
      ipNum
    })

    val DFResult: DataFrame = result.toDF("ipNum")

    //创建视图
    val table1: Unit = ipRulesRdd.createTempView("table1")
    val table2: Unit = DFResult.createTempView("table2")

    //写SQL
    val ys: DataFrame = session.sql("SELECT province,count(*) counts FROM table1 JOIN table2 ON (ipNum>=startNum AND ipNum<=endNum) GROUP BY province ORDER BY counts DESC")

    ys.show()

    session.stop()

  }
}

运行结果:

你执行上边代码的时候会发现很慢,数据量大的时候会更慢,这是因为进行查找的时候是一条一条数据进行比较的,而没有使用之前的二分查找,所以效率不高

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值