使用spark读取es中的数据并进行数据清洗,使用fp-growth算法进行加工

最近学了spark,用fg-growth算法进行数据的关联排序


object HelloPFg {
  def main(args: Array[String]) {

    val conf = new SparkConf().setAppName("Spark MLlib Exercise:K-Means Clustering")
    conf.set("es.index.auto.create", "true")
    conf.set("es.nodes", "192.168.100.100")

    val sc = new SparkContext(conf)

    var sqlsc = new SQLContext(sc)
    /**
      * 读取es中的数据,logstash是es中的索引名称,如果需要读取多个索引,则使用逗号将索引隔开即可
      * val esLogs = sc.esRDD("logstash-2016.04.04,logstash-2016.04.05").values
      * 如果需要读取不同的index中的不同的type中的数据,则分别读取,然后使用union将多个rdd合并成一个rdd即可
    val esLogs = sc.esRDD("logstash-2016.04.04/spark").values
    val esLogs1 = sc.esRDD("logstash-2016.04.05/docs").values
    val test=esLogs.union(esLogs1)
      * */
    val esLogs = sc.esRDD("logstash-2016.04.04").values//使用values取出数据中的values,本来取出的数据为Map

    val line_num = esLogs.count()
    //对数据进行过滤,只保留防火墙的数据
    val waf1 = esLogs.filter(_.contains("waf_logtype"))
    System.out.println("waf1:" + waf1.first())
    System.out.println("waf1:srcip:" + waf1.first().get("srcip"))
    //去掉含有message的数据
    var waf2 = waf1.map(m => m.-("message"))
    System.out.println("waf2...............waf2........."+waf2.first())
    //组装fp-growth需要的数据类型,fpg算法需要RDD类型的Array[String]类型
    var waf3 = waf2.map(m => Array(m.get("waf_logtype").toString(),
      m.get("url").toString().substring(0, dns(m.get("url").toString())+1),//对url进行过滤,去掉第一个反斜杠后面的部分
      m.get("srcip").toString(), m.get("method").toString()))
    
    println("...............waf3:........."+waf3.first())
    System.out.println("waf3:"+waf3.first().mkString(","))
    //设置最小支持度,以及分片的数量,分片的数量就是计算的结果会生成文件的个数
    val fpg = new FPGrowth()
      .setMinSupport(0.2)
      .setNumPartitions(10)
    val model = fpg.run(waf3)

    model.freqItemsets.collect().foreach { itemset =>
      println(itemset.items.mkString("[", ",", "]") + ", " + itemset.freq)
    }

    val minConfidence = 0.8
    model.generateAssociationRules(minConfidence).collect().foreach { rule =>
      println(
        rule.antecedent.mkString("[", ",", "]")
          + " => " + rule.consequent.mkString("[", ",", "]")
          + ", " + rule.confidence)
    }
  }
  private def dns(line: String): Int = {
    if (line.indexOf('/') > 0) line.indexOf('/')
    else 0
  }
}


你可能感兴趣的:(spark项目实战总结,spark,elasticsearch,scala,算法)