我正在尝试根据小时和/或天数计算统计指标。
意思是,我有一个类似这样的CSV文件:
TRANSACTION_URL START_TIME END_TIME SIZE FLAG
www.google.com 20170113093210 20170113093210 150 1
www.cnet.com 20170113114510 20170113093210 150 2
START_TIME和END_TIME采用yyyyMMddhhmmss
格式。
我首先使用以下代码将其转换为yyyy-MM-dd hh:mm:ss
格式:
from_pattern = 'yyyyMMddhhmmss'
to_pattern = 'yyyy-MM-dd hh:mm:ss'
log_df = log_df.withColumn('START_TIME', from_unixtime(unix_timestamp(
log_df['START_TIME'].cast(StringType()), from_pattern), to_pattern).cast(TimestampType()))
之后,我想使用groupBy()
来计算,例如,基于事务TIME框架的SIZE列的平均值。
例如,我想做类似的事情:
for all transactions that are between 09:00 to 11:00
calculate SIZE mean
for all transactions that are between 14:00 to 16:00
calculate SIZE mean
还有:
for all transactions that are in a WEEKEND date
calculate SIZE mean
for all transactions that are NOT in a WEEKEND date
calculate SIZE mean
我知道如何使用groupBy进行“默认”配置,例如根据FLAG列值计算SIZE列的统计度量。我正在使用类似的东西:
log_df.cache().groupBy('FLAG').agg(mean('SIZE').alias("Mean"), stddev('SIZE').alias("Stddev")).\
withColumn("Variance", pow(col("Stddev"), 2)).show(3, False)
所以,我的问题是:
如何在一段时间内完成此类分组和计算? (第1个伪代码示例)
如何按日期进行此类分组和计算? (第二个伪代码示例)
是否有任何python包可以接收yy-MM-dd
并返回true
如果是周末约会?
由于
答案 0 :(得分:1)
假设您有一个函数encode_dates,它接收日期并返回您感兴趣的所有时间段的编码序列。例如,对于星期二9-12,它将返回Seq(" 9-11"" 10-12"" 11-13""平日&#34)。这将是一个常规的scala函数(与spark无关)。
现在您可以将其设为UDF并将其添加为列并展开列,以便您拥有多个副本。现在您需要做的就是为groupby添加此列。
所以它看起来像这样:
val encodeUDF = udf(encode_dates _)
log_df.cache().withColumn("timePeriod", explode(encodeUDF($"start_date", $"end_date").groupBy('FLAG', 'timePeriod').agg(mean('SIZE').alias("Mean"), stddev('SIZE').alias("Stddev")).
withColumn("Variance", pow(col("Stddev"), 2)).show(3, False)