一:使用sparksql开发

1.sparksql开发的两种方式

  HQL:SQL语句开发

    eq : sqlContext.sql("xxxx")

  DSL : sparkSql中DataFrame的API调用方式

    eq:val df=sqlContext.xxx

       df.select("number")

二:HQL的开发案例

1.新建目录上传日志

  

2.开启服务

  

三:书写程序

1.描述

  这个程序一共包括两个部分。

  所以写的是两个程序。

2.程序一:对日志的描述--ApacheAccessLog

 package com.ibeifeng.bigdata.spark.log

 import scala.util.matching.Regex

 /**
* 64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846
* Created by ibf on 01/15.
*/
case class ApacheAccessLog(
ipAddress: String, // IP地址
clientId: String, // 客户端唯一标识符
userId: String, // 用户唯一标识符
serverTime: String, // 服务器时间
method: String, // 请求类型/方式
endpoint: String, // 请求的资源
protocol: String, // 请求的协议名称
responseCode: Int, // 请求返回值:比如:200、401
contentSize: Long // 返回的结果数据大小
) /**
* 64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846
* Created by ibf on 01/15.
* 提供一些操作Apache Log的工具类供SparkCore使用
*/
object ApacheAccessLog {
// Apache日志的正则
val PARTTERN: Regex =
"""^(\S+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (\S+) (\S+)" (\d{3}) (\d+)""".r /**
* 验证一下输入的数据是否符合给定的日志正则,如果符合返回true;否则返回false
*
* @param line
* @return
*/
def isValidateLogLine(line: String): Boolean = {
val options = PARTTERN.findFirstMatchIn(line) if (options.isEmpty) {
false
} else {
true
}
} /**
* 解析输入的日志数据
*
* @param line
* @return
*/
def parseLogLine(line: String): ApacheAccessLog = {
if (!isValidateLogLine(line)) {
throw new IllegalArgumentException("参数格式异常")
} // 从line中获取匹配的数据
val options = PARTTERN.findFirstMatchIn(line) // 获取matcher
val matcher = options.get // 构建返回值
ApacheAccessLog(
matcher.group(1), // 获取匹配字符串中第一个小括号中的值
matcher.group(2),
matcher.group(3),
matcher.group(4),
matcher.group(5),
matcher.group(6),
matcher.group(7),
matcher.group(8).toInt,
matcher.group(9).toLong
)
}
}

3.程序二:针对需求进行--LogAnalysis

 package com.ibeifeng.bigdata.spark.log

 import com.ibeifeng.bigdata.spark.core.ApacheAccessLog
import org.apache.spark.sql.{DataFrame, SQLContext}
import org.apache.spark.{SparkContext, SparkConf}
/**
* Created by Administrator on 2017/4/25.
*/
object LogAnalysis {
def main(args: Array[String]):Unit={
//sqlContext
val conf=new SparkConf()
.setMaster("local[*]")
.setAppName("log-analysis-sparksql")
val sc=SparkContext.getOrCreate(conf)
val sqlContext=new SQLContext(sc)
import sqlContext.implicits._ //如果不写,下面的转换不成功 //transform
val path="/spark/logs/input"
val rdd=sc.textFile(path)
val apacheAccessDataFrame=rdd
.filter(line=>ApacheAccessLog.isValidateLogLine(line))
.map(line => {
ApacheAccessLog.parseLogLine(line)
}).toDF() //rdd转换为DataFrame //register temptable
apacheAccessDataFrame.registerTempTable("log_analysis_temp_table")
sqlContext.sql("select * from log_analysis_temp_table limit 1").show() //需求一:求contentSize的平均值,最大值以及最小值
val resultDataFrame1=sqlContext.sql(
"""
|SELECT
|AVG(contentSize) as avg_contentSize,
|MAX(contentSize) as max_contentSize,
|MIN(contentSize) as min_contentSize
|FROM log_analysis_temp_table
""".stripMargin)
resultDataFrame1.show() //save //save as HDFS
val resultRdd=resultDataFrame1.map(row=>{
val avgSize=row.getAs[Double]("avg_contentSize")
val minSize=row.getAs[Long]("min_contentSize")
val maxSize=row.getAs[Long]("max_contentSize")
(avgSize,minSize,maxSize)
})
resultRdd.saveAsTextFile(s"/spark/logs/output/sql_${System.currentTimeMillis()}") //需求二:求各个返回值出现的数据个数
val resultDataFrame2=sqlContext.sql(
"""
|SELECT
|responseCode AS code,
|COUNT(1) AS count
|FROM log_analysis_temp_table
|GROUP BY responseCode
""".stripMargin
)
resultDataFrame2.show() //需求三:求访问次数大于N的IP地址,并对黑名单进行限制
val blackIP=Array("200-55-104-193.ds1.prima.net.ar","10.0.0.153","208-38-57-205.ip.cal.radiant.net")
val N=10
val resultDataFrame3=sqlContext.sql(
s"""
|SELECT
|ipAddress AS ip,
|COUNT(1) AS count
|FROM log_analysis_temp_table
|WHERE not(ipAddress in(${blackIP.map(ip=>s"'${ip}'").mkString(",")}))
|GROUP BY ipAddress
|HAVING count>${N}
""".stripMargin)
resultDataFrame3.show() //需求四:求访问次数最多的前k个endpoint的值
val k=10
val resultDataFrame4=sqlContext.sql(
s"""
|SELECT
| t.endpoint,
| t.count
|FROM(
|SELECT
| endpoint,
| COUNT(1) AS count
|FROM log_analysis_temp_table
|GROUP BY endpoint) t
|ORDER BY t.count DESC
|limit ${k}
""".stripMargin)
resultDataFrame4.show()
}
}

4.运行结果

  

  

  

  

  

  

  

038 spark中使用sparksql对日志进行分析(属于小案例)的更多相关文章

  1. 关于Spark中RDD的设计的一些分析

    RDD, Resilient Distributed Dataset,弹性分布式数据集, 是Spark的核心概念. 对于RDD的原理性的知识,可以参阅Resilient Distributed Dat ...

  2. spark读取 kafka nginx网站日志消息 并写入HDFS中(转)

    原文链接:spark读取 kafka nginx网站日志消息 并写入HDFS中 spark 版本为1.0 kafka 版本为0.8 首先来看看kafka的架构图 详细了解请参考官方 我这边有三台机器用 ...

  3. 踩坑事件:windows操作系统下的eclipse中编写SparkSQL不能从本地读取或者保存parquet文件

    这个大坑... .... 如题,在Windows的eclipse中编写SparkSQL代码时,编写如下代码时,一运行就抛出一堆空指针异常: // 首先还是创建SparkConf SparkConf c ...

  4. Spark中的编程模型

    1. Spark中的基本概念 Application:基于Spark的用户程序,包含了一个driver program和集群中多个executor. Driver Program:运行Applicat ...

  5. 【原】 Spark中Task的提交源码解读

    版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Stage的提交 http://www.cnblogs.com/yourarebest/p/5356769.html Spark中 ...

  6. Spark中的键值对操作-scala

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...

  7. Spark中的键值对操作

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...

  8. 【原创】大叔问题定位分享(11)Spark中对大表子查询加limit为什么会报Broadcast超时错误

    当两个表需要join时,如果一个是大表,一个是小表,正常的map-reduce流程需要shuffle,这会导致大表数据在节点间网络传输,常见的优化方式是将小表读到内存中并广播到大表处理,避免shuff ...

  9. 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用

    https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...

随机推荐

  1. Linux上printf命令的用法

    printf格式化输出 基本格式 printf [format] [文本1] [文本2] .. 常用格式替换符 %s 字符串 %f 浮点格式 %c ASCII字符,即显示对应参数的第一个字符 %d,% ...

  2. springboot配置文件的配置

    转:https://www.cnblogs.com/zheting/p/6707036.html Spring Boot使用了一个全局的配置文件application.properties,放在src ...

  3. 图形化调试工具DDD

    ubuntu安装DDD: sudo apt-get install ddd If you still need to compile it for some reason you should be ...

  4. Go(02)windows环境搭建和vscode配置

    之前讲述过linux环境下Go语言开发环境搭建,这次简述下windows的搭建以及vscode配置 windows环境搭建 同样去https://studygolang.com/dl下载windows ...

  5. 安装Python和Anaconda

    安装Python和Anaconda 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装anaconda anaconda包括了Python的集成开发环境. 1.打开下载的网站 ...

  6. JQuery中2个等号与3个等号的区别

    首先,== equality 等同,=== identity 恒等.==, 两边值类型不同的时候,要先进行类型转换,再比较.===,不做类型转换,类型不同的一定不等. 下面分别说明:先说 ===,这个 ...

  7. Spark记录-Scala语法基础

    参考:http://docs.scala-lang.org/cheatsheets/index.html.http://docs.scala-lang.org/.http://www.scala-la ...

  8. Javascript非构造函数的继承

    一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese = { nation:'中国' }; 还有一个对象,叫做&qu ...

  9. spring Mvc 执行原理 及 xml注解配置说明 (六)

    Spring MVC 执行原理 在 Spring Mvc 访问过程里,每个请求都首先经过 许多的过滤器,经 DispatcherServlet 处理; 一个Spring MVC工程里,可以配置多个的 ...

  10. iOS 根据生日得到生肖,星座,年龄的算法

    根据用户生日,得到相应的年龄,星座和生肖.有的项目中可能会用到,贴出来共享. 得到年龄,这个很简单了: - (void)getAgeWith:(NSDate*)birthday{ //日历 NSCal ...