數據準備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