如何使用sparkDataframe获得每周每小时和每一天发生的行数?

bhmjp9jg  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(344)

我想返回事件每周每小时发生的次数(按天和小时分组)。使用sparkDataframe,我可以得到一个包含“dateoccurred”字符串列的返回行列表(24日和17日是星期五,23日和16日是星期四)
行(dateoccurrent='24-04-2020 10:08:00')
行(dateoccurred='24-04-2020 11:52:00')
行(dateoccurred='24-04-2020 11:35:00')
行(dateoccurrent='23-04-2020 15:13:00')
行(dateoccurrent='23-04-2020 15:20:00')
行(dateoccurred='23-04-2020 23:52:00')
行(dateoccurrent='16-04-2020 15:22:00')
行(dateoccurrent='16-04-2020 23:12:00')
行(dateoccurrent='16-04-2020 14:28:00')
行(dateoccurrent='17-04-2020 10:16:00')
行(dateoccurrent='17-04-2020 11:19:00')
行(dateoccurrent='17-04-2020 12:52:00')
我想将结果转换为以下格式“
(‘星期五10’,2)
(‘星期五11’,3)
(‘星期五12’,1)
('15'星期四,3)
(“星期四23”,2)
('14'星期四,1)

sxissh06

sxissh061#

你必须从日期栏中提取日期和时间。今天,你有两个选择。首先,可以使用udf提取工作日全名。如果一天足够作为一个整数,您可以使用内置的pyspark功能。之后,可以连接这两列并执行groupby+计数

import datetime
import pyspark.sql.functions as f
from pyspark.sql.types import StringType

def  get_day_from_date(dt)
    dt_parsed = datetime.datetime.strptime(dt_2, '%d-%m-%Y %H:%M:%S')
    ans = datetime.date(dt_parsed.year, dt_parsed.month, dt_parsed.day)
    return ans.strftime("%A")

to_day = f.udf(get_day_from_date, StringType())
df = df.withColumn('dateOccurred_ts', f.to_timestamp('Timestamp', 'dd-MM-yyyy HH:mm:ss'))

# udf returns Weekday as locale’s full name

df = df.withColumn('day', to_day(f.col('dateOccurred')))

## other soulution only returns day of the week of a given date as integer.

df = df.withColumn('day', f.dayofweek('dateOccurred_ts'))

df = df.withColumn('hour', f.hour('dateOccured_ts'))
df_2 = df.select(f.concat_ws('_', f.col('day'), f.col('hour')))
df = df.groupBy('day_hour').agg(f.count(f.lit(1)).alias('dateOccurred_cnt'))

相关问题