zoukankan      html  css  js  c++  java
  • 日志统计分析

        /**
          * Spark SQL 用户自定义函数
          */
        import org.apache.spark.sql.functions._
        def formatComment() = udf((comment:String) =>{
                
        })
    
        /**
          * 在已有DF上添加或者修改字段
          */
        outputDF = outputDF.withColumn("dis_diag_comment", formatComment()(outputDF("dis_diag_comment")))
    
    
    
    import org.apache.spark.{SparkConf, SparkContext}
    
    /**
      * Description: 日志统计分析
      * .collect().foreach(println)
      * .take(10).foreach(println)
      *
      *
      * 分隔符 ,
      *map()是对每一行数据进行操作
      *reduceByKey()是将相同的Key分到一块去,进行+操作
      *
      * @Author: 留歌36
      * @Date: 2019/8/2 14:53
      */
    object LogApp {
      def main(args: Array[String]): Unit = {
        // Spark编程模板第一步:创建SparkContext
        val conf = new SparkConf().setMaster("local[2]").setAppName("LogApp")
        val sc = new SparkContext(conf)
    
        // Spark编程模板第二步:读取日志文件,并进行相应的业务逻辑处理
        val path = "D:\IDEA_Work\spark-august\data\hello.txt"
        val lines = sc.textFile(path)
    
        // TODO ...  需求一:求各域名的流量
        /**
          *  2 字段 域名
          *  4 字段 流量
          * 1) 先获取每条日志记录下的 域名11字段 流量 20字段
          *       log  ==> (11,20)
          * 2) 按照域名进行分组求和  reduceByKey()
          *
          * 3)拓展,成功了多少条,错误了多少条?
          *
          * .saveAsTextFile()
          */
    //    lines.map( x =>{
    //      val temp = x.split(",")
    //      var traffic = 0L  // 考虑到流量这个值可能脏数据,无法toLong
    //      try{
    //        traffic = temp(3).trim.toLong   // 考虑到空格的情况
    //      }catch {
    //        case e:Exception => traffic = 0L
    //      }
    //      (temp(1),traffic)
    //    }).reduceByKey(_+_).take(10).foreach(println)
    
    
        // TODO ...  需求二:求各省份访问次数的TopN(次数排序)
        /**
          *  5字段IP
          * 1) 日志中获取IP,解析为省份
          * 2) (省份, 1)
          * 3) reduceByKey(_+_)
          * 4) 排序
          *
          *
          */
        lines.map(x=>{
          val temp = x.split(",")
          (IpUtils.getProvince(temp(4)), 1)
        }).reduceByKey(_+_).sortBy(_._2, false).take(10).foreach(println)
    
        // TODO ...  需求三:求各域名下 各个文件资源(/a/b/c/123.mp4)的访问次数TopN
        /**
          * 6 字段 文件资源
          * http://domain/a/b/c/123.mp4?x=y&r=z
          * 定义:第一个/之后到第一个?之前的内容
          *
          *
          */
    
    //    lines.map(x=>{
    //      val temp = x.split(",")
    //      ((temp(1), getResource(temp(5))), 1)
    //    })
    //      .reduceByKey(_+_).groupBy(_._1._1)
    //      .mapValues(_.toList.sortBy(_._2).reverse.take(10))
    //      .collect().foreach(println)
    
    
        // TODO... 求访问次数最多的资源文件
    
    //    lines.map(x=>{
    //      val temp = x.split(",")
    //      (getResource(temp(5)), 1)
    //    }).reduceByKey(_+_).sortBy(_._2, false).collect().foreach(println)
    
    
    
        // Spark编程模板第三步:关闭SparkContext
      }
    
      def getResource(url :String)= {
        val pathTemp = url.replaceFirst("//","")
        var pathIndex = pathTemp.indexOf("/")
        var path =""
        if (pathIndex != -1){
          path = pathTemp.substring(pathIndex)
          pathIndex = path.indexOf("?")
          if (pathIndex != -1){
            path = path.substring(0, pathIndex)
          }
        }
        path
      }
    
    }
    
  • 相关阅读:
    vscode配置备份
    正则替换html代码中img标签的src值
    使用css3原生变量实现主题换肤
    vue3基础知识学习系列(二)响应式原理实现
    vue3基础知识学习系列(一)api使用
    eslint规则中文解释
    开发笔记:使用canvas实现3D金字塔比例图表📈
    实用网页UI调试技巧
    2020年特殊的一年,成就特殊的我们
    java设计模式之责任链模式
  • 原文地址:https://www.cnblogs.com/liuge36/p/12614736.html
Copyright © 2011-2022 走看看