第2关:第二题
任务描述
本关任务:根据编程要求,完成任务。
编程要求
打开右侧代码文件窗口,在 Begin 至 End 区域补充代码,完成任务。
from functools import partial
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
################ Begin ################
# 创建SparkSession
spark = SparkSession \
.builder \
.appName("StructuredSyslog") \
.getOrCreate()
# 读取实时数据
lines = spark \
.readStream \
.format("socket") \
.option("host", "localhost") \
.option("port", 8888) \
.load()
# 定义一个偏应用函数,从固定的 pattern 获取日志内匹配的字段
fields = partial(
regexp_extract, str="value", pattern="^(\w{3}\s*\d{1,2} \d{2}:\d{2}:\d{2}) (.*?) (.*?)\[*\d*\]*: (.*)$"
)
words = lines.select(
to_timestamp(format_string('2019 %s', fields(idx=1)), 'yy MMM d H:m:s').alias("timestamp"),
fields(idx=2).alias("hostname"),
fields(idx=3).alias("tag"),
fields(idx=4).alias("content"),
)
# 统计 CRON 这个进程每小时生成的日志数,并以时间顺序排列,水印设置为 1 分钟
windowedCounts1 = words \
.filter("tag = 'CRON'") \
.withWatermark("timestamp", "1 minutes") \
.groupBy(window('timestamp', "1 hour")) \
.count() \
.sort(asc('window'))
# 开始运行查询并在控制台输出
query = windowedCounts1 \
.writeStream \
.outputMode("complete") \
.format("console") \
.option('truncate', 'false')\
.trigger(processingTime="10 seconds") \
.start()
# 设置最长等待时长
query.awaitTermination(70)
################ End ################
第3关:第三题
任务描述
本关任务:根据编程要求,完成任务。
编程要求
打开右侧代码文件窗口,在 Begin 至 End 区域补充代码,完成任务。
from functools import partial
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
################ Begin ################
# 创建SparkSession
spark = SparkSession \
.builder \
.appName("StructuredSyslog") \
.getOrCreate()
# 读取实时数据
lines = spark \
.readStream \
.format("socket") \
.option("host", "localhost") \
.option("port", 7777) \
.load()
# 定义一个偏应用函数,从固定的 pattern 获取日志内匹配的字段
fields = partial(
regexp_extract, str="value", pattern="^(\w{3}\s*\d{1,2} \d{2}:\d{2}:\d{2}) (.*?) (.*?)\[*\d*\]*: (.*)$"
)
words = lines.select(
to_timestamp(format_string('2019 %s', fields(idx=1)), 'yy MMM d H:m:s').alias("timestamp"),
fields(idx=2).alias("hostname"),
fields(idx=3).alias("tag"),
fields(idx=4).alias("content"),
)
# 统计每小时的每个进程或者服务分别产生的日志总数,水印设置为 1 分钟
windowedCounts2 = words \
.withWatermark("timestamp", "1 minutes") \
.groupBy('tag', window('timestamp', "1 hour")) \
.count() \
.sort(asc('window'))
# 开始运行查询并在控制台输出
query = windowedCounts2 \
.writeStream \
.outputMode("complete") \
.format("console") \
.option('truncate', 'false')\
.trigger(processingTime="10 seconds") \
.start()
# 设置最长等待时长
query.awaitTermination(70)
################ End ################
第4关:第四题
任务描述
本关任务:根据编程要求,完成任务。
编程要求
打开右侧代码文件窗口,在 Begin 至 End 区域补充代码,完成任务。
from functools import partial
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
################ Begin ################
# 创建SparkSession
spark = SparkSession \
.builder \
.appName("StructuredSyslog") \
.getOrCreate()
# 读取实时数据
lines = spark \
.readStream \
.format("socket") \
.option("host", "localhost") \
.option("port", 6666) \
.load()
# 定义一个偏应用函数,从固定的 pattern 获取日志内匹配的字段
fields = partial(
regexp_extract, str="value", pattern="^(\w{3}\s*\d{1,2} \d{2}:\d{2}:\d{2}) (.*?) (.*?)\[*\d*\]*: (.*)$"
)
words = lines.select(
to_timestamp(format_string('2019 %s', fields(idx=1)), 'yy MMM d H:m:s').alias("timestamp"),
fields(idx=2).alias("hostname"),
fields(idx=3).alias("tag"),
fields(idx=4).alias("content"),
)
# 输出所有日志内容带 error 的日志
windowedCounts3 = words \
.filter("content like '%error%'")
# 开始运行查询并在控制台输出
query = windowedCounts3 \
.writeStream \
.outputMode("update") \
.format("console") \
.option('truncate', 'false')\
.trigger(processingTime="10 seconds") \
.start()
# 设置最长等待时长
query.awaitTermination(70)
################ End ################