基於FEA spk的web日誌分析

數據準備html

數據:美國宇航局肯尼迪航天中心WEB日誌正則表達式

數據下載:http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.htmlapache

咱們先來看看數據:首先將日誌加載到df表,並查看前十行服務器

打開fea的界面,運行如下命令url

spk= @udf df0@sys by spk.open_sparkspa

#建立spk的鏈接.net

df= @udf spk by spk.load_text with (/data/access_log_Jul95)日誌

#加載hdfs目錄/data/access_log_Jul95裏面的text文件regexp

a= @udf df by spk.dumphtm

dump a

下面給出字段的解釋:

數據解析

首先咱們將數據進行解析,這裏會用到正則表達式

df1= @udf df by spk.reg_extract with (regexp_extract('value', r'^([^\s]+\s)', 1).alias("host"),

regexp_extract('value', r'^.*\[(\d\d/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} -\d{4})]', 1).alias('timestamp'),

regexp_extract('value', r'^.*"\w+\s+([^\s]+)\s+HTTP.*"', 1).alias('path'),

regexp_extract('value', r'^.*"\s+([^\s]+)', 1).cast('integer').alias('status'),

regexp_extract('value', r'^.*\s+(\d+)$', 1).cast('integer').alias('content_size'))

#將df表的value字段進行正則表達式提取出第一個匹配的主機名,將其重命名爲host列

將df表的value字段進行正則表達式提取出第一個匹配的時間,將其重命名爲timestamp列

將df表的value字段進行正則表達式提取出第一個匹配的路徑,將其重命名爲path列

將df表的value字段進行正則表達式提取出第一個匹配的狀態碼,將它的類型轉化爲int類型並將其重命名爲status列

將df表的value字段進行正則表達式提取出第一個匹配的狀態碼,將它的類型轉化爲int類型並將其重命名爲status列

將df表的value字段進行正則表達式提取出第一個匹配的字節數,將它的類型轉化爲int類型並將其重命名爲content_size列

a= @udf df1 by spk.dump

dump a

數據清洗

首先咱們查看一下原始日誌包含多少空行。

a= @udf df by spk.df_null_count

dump a

 

能夠看到原始數據沒有空行

下面咱們統計每列有多少個null值

a= @udf df1 by spk.df_null_count

dump

能夠看到status列有一個空值,content_size列有19727個空值

df1= @udf df1 by spk.drop_null with (status)

#對status這列值進行過濾爲null的數據

dump a

a= @udf df1 by spk.df_null_count

能夠看到已通過濾掉了

df1= @udf df1 by spk.df_fillna with (content_size:0)

#將content_size列爲空值的填充爲0

a= @udf df1 by spk.df_null_count

dump a

 

能夠看到全部的列沒有空值了,下面進行數據的轉換

數據轉換

如今數據框中的timestamp列並非實際的時間戳,而是apache服務器的時間格式:[dd/mmm/yyyy:hh:mm:ss (+/-)zzzz],接下來咱們將其轉換爲標準的時間戳格式

df2= @udf df1 by spk.parse_time with ('timestamp','time')

#將apache服務器的時間格式timestamp列轉化爲列爲time的標準的時間戳格式

a= @udf df2 by spk.dump

dump a

數據統計

數據總覽

咱們先看一下content_size這一列數據的統計值:最大值,最小值,count等

df3= @udf df2 by spk.df_desc with (content_size)

#統計content_size這一列的最大值,最小值等指標

b= @udf df3 by spk.to_DF

dump b

HTTP響應狀態統計

下面咱們來分析一下HTTP的響應狀態,咱們把數據按照status分組計數,而後按照status排序

df4= @udf df2 by spk.df_agg_count with (status)

#將status字段進行分組統計計數

df4= @udf df4 by spk.order with (status)

#將統計後的結果按照status字段升序排序

a= @udf df4 by spk.to_DF

dump a

由此能夠看到status=200的佔據了很大一部分比例

客戶端訪問頻率統計,統計一下訪問服務器次數超過10次host

df5= @udf df2 by spk.df_agg_count with (host)

#對host字段進行分組統計次數

df5= @udf df5 by spk.filter with (count>10)

#對次數大於10的進行過濾,保留次數大於10

a= @udf df5 by spk.dump

dump a

URIs訪問量統計. 統計服務區資源的訪問量,首先按照path進行分組,而後計數

df6= @udf df2 by spk.df_agg_count with (path)

#對path字段進行分組統計計數

df6= @udf df6 by spk.order with (count,desc)

#將統計後的結果按照count字段進行降序排列

a= @udf df6 by spk.dump

dump a

能夠看到,圖片的url訪問量最多

統計HTTP返回狀態不是200的十大URL。首先查詢全部的 status <> 200 的記錄, 而後按照path進行分組統計排序,顯示結果

df7= @udf df2 by spk.filter with (status<>200)

#將status不是200的數據保留下來

df7= @udf df7 by spk.df_agg_count with (path)

#對過濾後的path字段進行分組計數

df7= @udf df7 by spk.order with (count,desc)

#將統計後的的表按照count降序排列

a= @udf df7 by spk.dump

#查看前10條數據

dump a

統計host的數量。潛在條件:對host字段進行去重

df8= @udf df2 by spk.loc with (host)

#選擇host列

df8= @udf df8 by spk.distinct

#進行去重

b= @udf df8 by spk.count

#統計數量

dump b

統計每日的訪客數(根據host去重)

1, 選擇 time 和 host 兩列值

2, 將同一天的host相同進行去重

3, 最後按照day進行分組統計天天host訪問量.

df9= @udf df2 by spk.extract_day with ('host',dayofmonth('time').alias('day') )

#選擇host列,從time字段提取出天數並命名爲day列

df9= @udf df9 by spk.distinct

#對這2個字段進行去重

df9= @udf df9 by spk.df_agg_count with (day)

#對day字段進行分組統計

df9= @udf df9 by spk.order with (day)

#按照day字段從小到大排序

b= @udf df9 by spk.to_DF

dump b

相關文章
相關標籤/搜索