我有一个dataframe log_df:
我根据以下代码生成一个新的dataframe:
from pyspark.sql.functions import split, regexp_extract
split_log_df = log_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_log_df.show(10, truncate=False)
新的dataframe如下:
我需要另一篇专栏文章来展示一周中的每一天,什么是最好的优雅的方式来创建它?理想情况下,只需在select中添加一个类似于udf的字段。
非常感谢。
更新:我的问题与注释中的问题不同,我需要的是根据log_df中的字符串进行计算,而不是像注释那样基于时间戳,所以这不是一个重复的问题。谢谢。
发布于 2016-08-13 02:57:19
我终于自己解决了这个问题,这是一个完整的解决方案:
我对我的解决方案不满意,因为它似乎是如此的锯齿状,如果有人能想出一个更优雅的解决方案,我们将不胜感激,谢谢你提前。
发布于 2017-06-07 10:13:40
我建议一些不同的方法
from pyspark.sql.functions import date_format
df.select('capturetime', date_format('capturetime', 'u').alias('dow_number'), date_format('capturetime', 'E').alias('dow_string'))
df3.show()
它给了..。
+--------------------+----------+----------+
| capturetime|dow_number|dow_string|
+--------------------+----------+----------+
|2017-06-05 10:05:...| 1| Mon|
|2017-06-05 10:05:...| 1| Mon|
|2017-06-05 10:05:...| 1| Mon|
|2017-06-05 10:05:...| 1| Mon|
|2017-06-05 10:05:...| 1| Mon|
|2017-06-05 10:05:...| 1| Mon|
|2017-06-05 10:05:...| 1| Mon|
|2017-06-05 10:05:...| 1| Mon|
发布于 2021-06-17 03:56:59
从Spark2.3开始,您可以使用一周中的Spark函数https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.sql.functions.dayofweek.html
from pyspark.sql.functions import dayofweek
df.withColumn('day_of_week', dayofweek('my_timestamp'))
然而,这将一周的开始定义为星期日=1。
如果你不想那样做,而是要求星期一= 1,那么你可以做一个不雅的软糖,比如在使用“一周”函数之前减去一天,或者像这样修改结果
from pyspark.sql.functions import dayofweek
df.withColumn('day_of_week', ((dayofweek('my_timestamp')+5)%7)+1)
https://stackoverflow.com/questions/38928919
复制相似问题