pyspark 中的每月聚合

Posted

技术标签:

【中文标题】pyspark 中的每月聚合【英文标题】:Monthly Aggregation in pyspark 【发布时间】:2018-09-29 05:41:33 【问题描述】:

我正在寻找一种按月汇总数据的方法。我首先想在我的访问日期中只保留一个月。我的 DataFrame 如下所示:

Row(visitdate = 1/1/2013, 
patientid = P1_Pt1959, 
amount = 200, 
note = jnut, 
) 

我的目标是随后按访问日期分组并计算金额总和。我试过这个:

from pyspark.sql import SparkSession

spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()

file_path = "G:/Visit Data.csv"
patients = spark.read.csv(file_path,header = True)
patients.createOrReplaceTempView("visitdate")

sqlDF = spark.sql("SELECT visitdate,SUM(amount) as totalamount from visitdate GROUP BY visitdate")
sqlDF.show()

这是结果:

visitdate|totalamount|
+----------+-----------+
|  9/1/2013|    10800.0|
|25/04/2013|    12440.0|
|27/03/2014|    16930.0|
|26/03/2015|    18560.0|
|14/05/2013|    13770.0|
|30/06/2013|    13880.0

我的目标是得到这样的东西:

  visitdate|totalamount|
+----------+-----------+
|1/1/2013|    10800.0|
|1/2/2013|    12440.0|
|1/3/2013|    16930.0|
|1/4/2014|    18560.0|
|1/5/2015|    13770.0|
|1/6/2015|    13880.0|

【问题讨论】:

Group spark dataframe by date的可能重复 【参考方案1】:

你可以先formatvisitdate然后分组:

from pyspark.sql import functions as F

(df.withColumn('visitdate_month', F.date_format(F.col('visitdate'), '1/M/yyyy'))
.groupBy('visitdate_month')
.agg(F.sum(F.col('visitdate_month')))
)

【讨论】:

在访问日期月中获取空数据|计数| +---------------+------+ | 2014-08-01| 241| | 2015-04-01| 245| | 2014-11-01| 247| | 2014-09-01| 246| | 2013-08-01| 187| | 2015-02-01| 269| | 2014-05-01| 277| |空|204363| | 2015-06-01| 260| | 2015-03-01| 242| | 2013-12-01| 181|跨度> 抱歉,您必须先将字符串转换为日期,然后再转换为其他字符串格式。请参阅我的更新答案。 这次全部数据为空 +---------------+------- -+ |visitdate_month|sum(visitdate_month)| +---------------+--------+ | 2013 年 1 月 1 日|空| +---------------+--------+ 我更新了我的答案。 date_format 可以解析日期并将其转换为您的格式。【参考方案2】:

看起来“visitdate”列的类型是String,可以用“unix_timestamp”转换为Timestamp,然后用“date_format”转换为所需格式的String。之后,可以在 Scala 上进行分组:

val visitMonthDf = df.withColumn("visitMonth", date_format(unix_timestamp($"visitdate", "dd/MM/yyyy").cast(TimestampType), "1/M/yyyy"))
visitMonthDf.groupBy("visitMonth").agg(sum($"totalamount"))

【讨论】:

注意:问题是用python标记的 猜猜,可以由问题作者翻译成Python。

以上是关于pyspark 中的每月聚合的主要内容,如果未能解决你的问题,请参考以下文章

根据 pyspark 中的条件聚合值

在 pyspark 中聚合 Kolmogorov Smirnov 测试

在 groupby 操作 PySpark 中聚合列中的稀疏向量

如何使用 groupby 和聚合将 pyspark 数据框中的行与多列连接起来

如何在pyspark中的聚合函数之后保持列的顺序一致

Pyspark 将列列表转换为聚合函数