Python 无法通过在pyspark中翻转1小时的窗口进行分组

Python 无法通过在pyspark中翻转1小时的窗口进行分组,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我是spark的新手。我有一个用例,我正在努力完成它。我的用例是-有一个由web服务器生成的日志文件,其中包含以下格式的日志 Hostname Timestamp GetOrPost ErrorCode ByteSize 141.243.1.172 [29:23:53:25] "GET /Software.html HTTP/1.0" 200 1497 query2.lycos.cs.cmu.edu [29:23:53:36] "GET /Consumer.html

我是spark的新手。我有一个用例,我正在努力完成它。我的用例是-有一个由web服务器生成的日志文件,其中包含以下格式的日志

Hostname Timestamp GetOrPost ErrorCode ByteSize
141.243.1.172 [29:23:53:25] "GET /Software.html HTTP/1.0" 200 1497
query2.lycos.cs.cmu.edu [29:23:53:36] "GET /Consumer.html HTTP/1.0" 200 1325
tanuki.twics.com [29:23:53:53] "GET /News.html HTTP/1.0" 200 1014
我想按主机名分组,并获得每小时(翻滚小时)每个唯一主机名的字节大小总和。 我下面的代码没有分组,但输出似乎不正确。不确定代码中有什么错误

Python代码:

import re
import findspark
findspark.init()
from pyspark.sql import SparkSession, SQLContext
from pyspark.sql.functions import split, regexp_extract

spark = SparkSession.builder.appName("LogAnalysis").getOrCreate()
sc = spark.sparkContext
sqlContext = SQLContext(sc)
base_df = sqlContext.read.text("C:/Users/Documents/log.txt")
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'^.*\s+(\d+)$', 1).cast('integer').alias('content_size'))

split_df.groupby('host').sum("content_size")
split_df.show(15,truncate=False)

您可以从时间戳列中获取小时(仅取前两位数字),然后按主机和小时分组

从pyspark.sql导入函数为F
base_df=spark.read.text(“log2.txt”)
split_df=base_df.select(regexp_extract('value',r'^([^\s]+)\s',1)。别名('host'),
regexp_extract('value',r'^.*\[(\d{2}:\d{2}:\d{2}:\d{2})\]',1).alias('timestamp'),
regexp_extract('value',r'^.*\s+(\d+)$',1).cast('integer')。别名('content_size'))\
.filter(“主机名”)\
.withColumn('hour',F.substring(F.col('timestamp'),0,2))
split_df.groupby('host','hour').sum('content_size').show(15,truncate=False)

我已更改了时间戳列的regexp。

您可以从时间戳列中获取小时(只需取前两位数字),然后按主机和小时分组

从pyspark.sql导入函数为F
base_df=spark.read.text(“log2.txt”)
split_df=base_df.select(regexp_extract('value',r'^([^\s]+)\s',1)。别名('host'),
regexp_extract('value',r'^.*\[(\d{2}:\d{2}:\d{2}:\d{2})\]',1).alias('timestamp'),
regexp_extract('value',r'^.*\s+(\d+)$',1).cast('integer')。别名('content_size'))\
.filter(“主机名”)\
.withColumn('hour',F.substring(F.col('timestamp'),0,2))
split_df.groupby('host','hour').sum('content_size').show(15,truncate=False)

我已更改了时间戳列的regexp。

时间戳的regexp与您给出的示例数据不匹配。也许您可以更新示例数据或regexp?我也在尝试修复regex。另外,正在寻找另一种方法来解决这个问题,而不使用正则表达式。您在示例数据中给出的时间戳值的含义是什么?时间戳仅为一天中从0到24小时的小时数。格式为小时:分钟:秒:毫秒。我们不需要担心日期,因为日志只用于一天。时间戳的regexp与您给出的示例数据不匹配。也许您可以更新示例数据或regexp?我也在尝试修复regex。另外,正在寻找另一种方法来解决这个问题,而不使用正则表达式。您在示例数据中给出的时间戳值的含义是什么?时间戳仅为一天中从0到24小时的小时数。格式为小时:分钟:秒:毫秒。我们不需要担心日期,因为日志只记录一天。