Spark做日誌分析

  • 使用數據
    選用1天的搜狗搜索引擎網頁查詢日誌數據。
  • 數據格式爲
    訪問時間\t用戶ID\t[查詢詞]\t該URL在返回結果中的排名\t用戶點擊的順序號\t用戶點擊的URL

  • 其中,用戶ID是根據用戶使用瀏覽器訪問搜索引擎時的Cookie信息自動賦值,即同一次使用瀏覽器輸入的不同查詢對應同一個用戶ID

使用環境:jupyter notebook

任務:

rdd創建:

logRDD = sc.textFile('file:///home/workspace/data/lycdata/SogouQ.reduced')
logRDD.count()

輸出日誌條數:1724264

  • 統計用戶在00:00:00到12:00:00之間的查詢數
logRDD.map(lambda x : x.split('\t'))
    .filter(lambda x : 0 <= int(x[0].split(':')[0])*3600 +     int(x[0].split(':')[1])*60 + int(x[0].split(':')[2]) <= 12*3600)
    .count()

結果:527300

  • 搜索結果排名第一,但是點擊次序排在第二的數據有多少
logRDD.map(lambda x : x.split('\t'))
    .filter(lambda x : x[3].split(' ')[0] == '1' and  x[3].split(' ')[1] == '2')
    .count()

結果:79765

  • 統計每個時間點的查詢次數
    (得到一個包含的列爲:時間,該時間對應的查詢次數的PairRDD)
time_num_rdd = logRDD.map(lambda x : x.split('\t')).map(lambda x : (x[0], 1) )
# 相同的key做reduce
result_rdd = time_num_rdd.reduceByKey(lambda v1, v2:  v1 + v2)
# 按照key排序
result_rdd_sort = result_rdd.sortByKey()
result_rdd_sort.collect()

結果如下圖:
這裏寫圖片描述
使用matplotlib對結果進行可視化:

result_list_sort = result_rdd_sort.collect()
# time
x = []
# query count
y = []
for i in range(0, len(result_list_sort)):
    x.append(result_list_sort[i][0]) 
    y.append(result_list_sort[i][1]) 
plt.figure(1)
plt.plot(range(0,len(x)), y)
plt.show()

這裏寫圖片描述

  • 計算每個小時的用戶搜索次數
hour_count_list = result_rdd_sort.map(lambda (x, y): (x.split(':')[0], y))
    .reduceByKey(lambda k,v: k+v)
    .sortByKey().collect()

結果:
這裏寫圖片描述

可視化:

hour_count_list = hour_rdd.collect()
# hour
x = []
# query count
y = []
for i in range(0, len(hour_count_list)):
    x.append(hour_count_list[i][0]) 
    y.append(hour_count_list[i][1]) 
  • 折線圖
plt.xlabel("time")
plt.ylabel("query_count")
plt.title("User query plot")    

plt.figure(1)
plt.plot(x, y)
plt.show()

這裏寫圖片描述

  • 條形圖1(使用Axi繪製)
fig, ax = plt.subplots()
fig.set_figwidth(16)
labels = ['0', '1', '2', '3', '4',  '5',  '6',  '7', '8', '9','10', '11', '12', '13', '14','15','16','17','18','19','20','21','22','23']

# alpha顏色深淺,width條形寬度(百分比),coler條形顏色
rect = ax.bar( x, y, width=0.6,alpha = .5, color = 'g')
# plt.bar(range(len(x)), y, tick_label=labels, alpha = .5, width=0.6, color = 'g')

#設置x軸刻度,0.3=width/2,使x軸刻度位於條形圖中間部分
ax.set_xticks(np.arange(len(x))+0.3)
ax.set_xticklabels(labels)

# 設置圖例
ax.legend(['hour'])

ax.set_xlabel("time")
ax.set_ylabel("query_count")
ax.set_title("User query plot")    

# 爲每個條形圖設置標籤
for a, b in zip(x, y):
    ax.text(a, b+0.05, '%.0f' % b, ha='center', va= 'bottom',fontsize=7)

# 顯示網格
plt.grid()
plt.show()

這裏寫圖片描述

  • 條形圖2(plt繪製)
plt.figure(figsize=(8,6))

# align設置刻度和條形圖居中
plt.bar(range(len(x)),y,width = 0.6,align='center',color = 'c',alpha=0.5)
plt.xticks(range(len(x)),labels,size='small',rotation=30)

plt.xlabel(u'time')
plt.ylabel(u'query_count')
plt.title(u'User query plot')

# 爲每個條形圖設置標籤,zip函數接受任意多個(包括0個和1個)序列作爲參數,返回一個tuple列表
for a, b in zip(x, y):
    plt.text(a, b+0.05, '%.0f' % b, ha='center', va= 'bottom',fontsize=7)

plt.show()

這裏寫圖片描述

總結:主要是練習SparkRDD的一些基本操作,包括普通RDD與PairRDD,如何把一個普通RDD轉換爲(key,value)鍵值對RDD,然後進行統計操作。另一方面是對python可視化工具matplotlib的學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章