这里我们展示如何使用Spark来分析网络服务器日志。
服务器日志是富含信息的通用大数据。Spark提供了能快速简便执行这类数据分析的工具。日志数据可以来自多个源,如网络、文件、计算机服务器、应用日志、用户产生的内容,并可以用于监视服务器、改善商业和客户信息、构建推荐系统、欺诈侦测以及更多的应用。
首先我们需要载入一些会用到的库
import re
import datetime
from databricks_test_helper import Test
载入日志文件并快速浏览一下数据
import sys
import os
log_file_path = “...”
base_df = sqlContext.read.text(log_file_path)
base_df.printSchema()
base_df.show(truncate=False)
尝试性的进行数据分析
网络日志一般含有以下信息:
remotehost rfc931 authuser [date] "request" status bytes
field | meaning |
---|---|
remotehost | Remote hostname (or IP number if DNS hostname is not available). |
rfc931 | The remote logname of the user. We don't really care about this field. |
authuser | The username of the remote user, as authenticated by the HTTP server. |
[date] | The date and time of the request. |
"request" | The request, exactly as it came from the browser or client. |
status | The HTTP status code the server sent back to the client. |
bytes | The number of bytes (Content-Length ) transferred to the client. |
接下来,我们要将这些信息解析到单独的栏,我们使用内置的regexp_extract()函数。
from pyspark.sql.functions import split, regexp_extract
split_df = base_df.select(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'))
split_df.show(truncate=False)
数据清洗
首先我们要将原始数据集中的所有null行去除
base_df.filter(base_df['value'].isN