慕课网日志分析实战二:日志解析

1.定义类型
在日志解析前我们需要先知道我们需要从日志中获取什么,首先我们要了解一下日志:
这里写图片描述
这个日志中一共有四个字段分别为:日期、网址、流量、Ip。这是我们首先要了解到的。接下来我们需要再看需求:

  • 需求一:统计imooc主站最受欢迎课程/手记的topn访问次数
  • 需求二:按地市统计imooc主站最受欢迎topn课程
  • 需求三:按流量统计imooc主站最受欢迎的topn课程

从需求上我们可以发现,我们需要什么字段如下

URL(网址) CmsType(课程类型) CmsId(课程Id) traffic(流量) ip city time day
http://www.imooc.com/video/4500 video 4500 304 218.75.35.226 2017-05-11 14:09:14 20170511

从表中我们就可得知如何将RDD转化为DataFrame,DataFrame中的字段都有哪些,这样我们才能有计划有方法的转化DataFrame。

2.RDD转化为DataFrame
RDD转化WieDataFrame一共有两种方式,各有优劣

  • 利用反射的方式(适合于Schema已知的场景)
  • 利用编程的方式来指定(适合于Schema未场景)

如果这方面不太了解,欢迎踩踩我的博客如下:
https://blog.csdn.net/weixin_39216383/article/details/80494630

我选择第二种方式,通过编程实现,代码如下

//对于这个代码,我们需要从中获取两个参数
    一.Schema
    二.ROW

object AccessConvertUtil {
  val struct=StructType(
    Array(
      StructField("url",StringType),
      StructField("cmsType",StringType),
      StructField("cmsId",LongType),
      StructField("traffic",LongType),
      StructField("ip",StringType),
      StructField("city",StringType),
      StructField("time",StringType),
      StructField("day",StringType)
    )
  )//
  def parse(log:String)  =
  {
    try {
      val splits = log.split("\t")
      val url = splits(1)
      val traffic = splits(2).toLong
      val ip = splits(3)
      val domain = "http://www.imooc.com/"
      val cms = url.substring(url.indexOf(domain) + domain.length)
      val cmsTypeId = cms.split("/")

      var cmsType = ""
      var cmsId = 0l
      if (cmsTypeId.length > 1) {
        cmsType = cmsTypeId(0)
        cmsId = cmsTypeId(1).toLong
      }
      val city =//IpUtils.getCity(ip) 根据Ip转换城市下一节详细讲解
      val time = splits(0)
      val day = time.substring(0, 10).replace("-", "")

      Row(url, cmsType, cmsId, traffic, ip, city, time, day)
    }catch {
      case e:Exception=>Row(0)
    }
  }

}

3.测试结果

val spark=SparkSession.builder().appName("TopNStatJob")
      //.config("spark.sql.sources.partitionColumnTypeInference.enabled","false")
      .master("local[2]")
      .getOrCreate()
    val access=spark.sparkContext.textFile("C:\\Users\\wl105\\Desktop\\imooclog\\access.log")

    //RDD转化为DF
    val accessDF=spark.createDataFrame(access.map(x=>AccessConvertUtil.parse(x)),AccessConvertUtil.struct).show(20)
+--------------------+-------+-----+-------+---------------+----+-------------------+--------+
|                 url|cmsType|cmsId|traffic|             ip|city|               time|     day|
+--------------------+-------+-----+-------+---------------+----+-------------------+--------+
|http://www.imooc....|  video| 4500|    304|  218.75.35.226|  |2017-05-11 14:09:14|20170511|
|http://www.imooc....|  video|14623|     69| 202.96.134.133|  |2017-05-11 15:25:05|20170511|
|http://www.imooc....|article|17894|    115| 202.96.134.133|  |2017-05-11 07:50:01|20170511|
|http://www.imooc....|article|17896|    804|  218.75.35.226|  |2017-05-11 02:46:43|20170511|
|http://www.imooc....|article|17893|    893|222.129.235.182|  |2017-05-11 09:30:25|20170511|
|http://www.imooc....|article|17891|    407|  218.75.35.226|  |2017-05-11 08:07:35|20170511|
|http://www.imooc....|article|17897|     78| 202.96.134.133|  |2017-05-11 19:08:13|20170511|
|http://www.imooc....|article|17894|    658|222.129.235.182|  |2017-05-11 04:18:47|20170511|
|http://www.imooc....|article|17893|    161|   58.32.19.255|  |2017-05-11 01:25:21|20170511|
|http://www.imooc....|article|17895|    701|    218.22.9.56|  |2017-05-11 13:37:22|20170511|
|http://www.imooc....|article|17892|    986|  218.75.35.226|  |2017-05-11 05:53:47|20170511|
|http://www.imooc....|  video|14540|    987|   58.32.19.255|  |2017-05-11 18:44:56|20170511|
|http://www.imooc....|article|17892|    610|  218.75.35.226|  |2017-05-11 17:48:51|20170511|
|http://www.imooc....|article|17893|      0|    218.22.9.56|  |2017-05-11 16:20:03|20170511|
|http://www.imooc....|article|17891|    262|   58.32.19.255|  |2017-05-11 00:38:01|20170511|
|http://www.imooc....|  video| 4600|    465|  218.75.35.226|  |2017-05-11 17:38:16|20170511|
|http://www.imooc....|  video| 4600|    833|222.129.235.182|  |2017-05-11 07:11:36|20170511|
|http://www.imooc....|article|17895|    320|222.129.235.182|  |2017-05-11 19:25:04|20170511|
|http://www.imooc....|article|17898|    460| 202.96.134.133|  |2017-05-11 15:14:28|20170511|
|http://www.imooc....|article|17899|    389|222.129.235.182|  |2017-05-11 02:43:15|20170511|
+--------------------+-------+-----+-------+---------------+----+-------------------+--------+
only showing top 20 rows

从结果中我们可以看出我们想要的数据已经获取了大部分的数据,接下来我们需要获取city的数据。

猜你喜欢

转载自blog.csdn.net/weixin_39216383/article/details/80494210