一:使用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. 从web启动winform程序

    最近有个客户提出想从网站上启动一个客户端的程序,研究了下,实现方法如下: 1. 注入注册表 try                {                    string appPath ...

  2. Python 通过gevent实现协程

    #coding:utf-8-*- '''协程(coroutine)又称微线程.纤程,是一种用户级的轻量级线程.协程有自己的寄存器上下文和栈.携程调度时,将寄存器上下文和栈 保存,在切换回来的时候恢复保 ...

  3. python之旅:面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  4. numpy 基础 —— np.linalg

  5. SQL Server手把手教你使用profile进行性能监控

    介绍 经常会有人问profile工具该怎么使用?有没有方法获取性能差的sql的问题.自从转mysql我自己也差不多2年没有使用profile,忽然profile变得有点生疏不得不重新熟悉一下.这篇文章 ...

  6. 工具类 | window批处理杀死指定端口进程

    window批处理杀死指定端口进程,注意保存时使用ansi格式,运行输入端口即可 @echo off setlocal enabledelayedexpansion set /p port=请输入端口 ...

  7. bzoj千题计划229:bzoj4424: Cf19E Fairy

    http://www.lydsy.com/JudgeOnline/problem.php?id=4424 图是二分图的条件:没有奇环 所以,如果图不存在奇环,删除任意一条边都可以 如果存在奇环, 对于 ...

  8. 用matplotlib制作的比较满意的蜡烛图

    用matplotlib制作的比较满意的蜡烛图 2D图形制作包, 功能强大, 习练了很久, 终于搞定了一个比较满意的脚本. 特点: 使用方面要非常简单 绘制出来的图要非常的满意, 具有如下的特点 时间和 ...

  9. 让你的HTML5&CSS3网站在老IE中也能正常显示的3种方法

    起初,IE其实也是一款非常有进取心的浏览器.但经过一段时间的蛰伏后,它已经成为了我们生活中的一道障碍.微软现在又重新开始向其它浏览器发起挑战,但事实情况是,新版的现代IE浏览器一直滞后于谷歌浏览器和火 ...

  10. 关于Cookie跨域的问题

    Cookie是一个伟大的发明,它允许Web开发者保留他们的用户的登录状态.但是当你的站点有一个以上的域名时就会出现问题了.在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名 ...