• spark学习进度17——案例


    需求:

    计算每个城市的访问量

    ip.txt:

    ipaccess.log:

    解决:

     1 package com.bigdata.spark.core.wc
     2 
     3 import org.apache.spark.rdd.RDD
     4 import org.apache.spark.{SparkConf, SparkContext}
     5 
     6 object IpInfor {
     7   def main(args:Array[String]):Unit={
     8     //创建Spark运行配置对象
     9     val conf=new SparkConf()
    10     conf.setMaster("local[1]")
    11     conf.setAppName("ipInfor")
    12     //创建Spark上下文环境对象(连接对象)
    13     val sc=new SparkContext(conf)
    14 
    15     val rdd1: RDD[String] = sc.textFile("E:\\user\\IDEA\\sparkt1\\datas\\ip.txt")//读取文件  --规则数据
    16     val rdd2=sc.textFile("E:\\user\\IDEA\\sparkt1\\datas\\ipaccess.log")//读取文件  --日志数据
    17     val rdd3= rdd2.map(_.split("\\|")(1)) //访问日志信息  通过"|"进行拆分  只要IP
    18     val rdd4 = rdd1.map(a => {
    19       //规则库数据,通过"|"截取第2-3-6  --小限度  -- 大限度   --省份
    20       val splitData = a.split("\\|")
    21       (splitData(2).toLong, splitData(3).toLong, splitData(6))//startIp  endIp  province
    22     })
    23     //将rdd4的信息收集到本地  --收集的规则库数据
    24     val ipReles: Array[(Long, Long, String)] = rdd4.collect()
    25 
    26     //将IP地址和规则数据信息进行匹配
    27     val res: RDD[Array[(Long, Long, String)]] = rdd3.map(a => {
    28       val longIp = ip2Long(a)
    29       ipReles.filter(b => {
    30         longIp >= b._1 && longIp <= b._2
    31       })
    32     })
    33     val provineRes = res.map(a => {
    34       if (a == null || a.isEmpty)
    35         ("无效数据", 1)
    36       else
    37         (a(0)._3, 1)//获取省份信息 省份 1 省份 1  省份 1  省份 1
    38     })
    39     val finalRDD = provineRes.reduceByKey(_+_)
    40     finalRDD.foreach(println)
    41 
    42   }
    43   //把IP转换成long类型的方法  125.213.100.123 ------> 2111136891
    44   def ip2Long(ip: String): Long = {
    45     val fragments = ip.split("[.]")
    46     var ipNum = 0L
    47 
    48     for (i <- 0 until fragments.length) {
    49       ipNum = fragments(i).toLong | ipNum << 8L
    50 
    51     }
    52     val t2 = System.currentTimeMillis()
    53     ipNum
    54   }
    55 }

    结果:

  • 相关阅读:
    position : sticky
    学习笔记之段落里面最后出现省略号
    two or more web modules defined in the configuration have the same context root
    Android笔记:ActivitySpinner
    设计一个通讯录的XML文件
    使用JDBC连接SQL Server数据库
    SNMP使用UDP传送报文。为什么不使用TCP?
    计算Java程序运行时间
    android在xml的textStyle中,设置一个字体是粗体或斜体或带有下划线
    schema.xml文件里datatype的定义格式
  • 原文地址:https://www.cnblogs.com/znjy/p/15623917.html
Copyright © 2020-2023  润新知