Spark - 按时间戳范围排序的统计计算

时间:2017-01-20 09:26:45

标签: python apache-spark group-by pyspark aggregate

我正在尝试根据小时和/或天数计算统计指标。

意思是,我有一个类似这样的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. 如何在一段时间内完成此类分组和计算? (第1个伪代码示例)

  2. 如何按日期进行此类分组和计算? (第二个伪代码示例)

  3. 是否有任何python包可以接收yy-MM-dd并返回true如果是周末约会?

    由于

1 个答案:

答案 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)