pyspark子串和聚合

2024-04-09

我是 Spark 新手,我有一个包含此类数据的 csv 文件:

date,            accidents, injured
2015/20/03 18:00    15,          5
2015/20/03 18:30    25,          4
2015/20/03 21:10    14,          7
2015/20/02 21:00    15,          6

我想按事件发生的特定时间汇总这些数据。我的想法是将日期子串为“年/月/日 hh”,不带分钟,这样我就可以将其作为键。我想按小时给出事故和伤害的平均值。也许 pyspark 有一种不同的、更智能的方法?

多谢你们!


好吧,我想这取决于你之后要做什么。

最简单的方法是按照您的建议进行操作:对日期字符串进行子串,然后聚合:

data = [('2015/20/03 18:00', 15, 5), 
    ('2015/20/03 18:30', 25, 4),
    ('2015/20/03 21:10', 14, 7),
    ('2015/20/02 21:00', 15, 6)]
df = spark.createDataFrame(data, ['date', 'accidents', 'injured'])

df.withColumn('date_hr',
              df['date'].substr(1, 13)
     ).groupby('date_hr')\
      .agg({'accidents': 'avg', 'injured': 'avg'})\
      .show()

但是,如果您想稍后进行更多计算,可以将数据解析为TimestampType()然后从中提取日期和时间。

import pyspark.sql.types as typ
from pyspark.sql.functions import col, udf
from datetime import datetime

parseString =  udf(lambda x: datetime.strptime(x, '%Y/%d/%m %H:%M'),   typ.TimestampType())
getDate =  udf(lambda x: x.date(), typ.DateType())
getHour = udf(lambda x: int(x.hour), typ.IntegerType())

df.withColumn('date_parsed', parseString(col('date'))) \
    .withColumn('date_only', getDate(col('date_parsed'))) \
    .withColumn('hour', getHour(col('date_parsed'))) \
    .groupby('date_only', 'hour') \
    .agg({'accidents': 'avg', 'injured': 'avg'})\
    .show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pyspark子串和聚合 的相关文章

随机推荐